evaluation

package
v2.0.0-alpha.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 16, 2024 License: Apache-2.0 Imports: 20 Imported by: 0

Documentation

Overview

Package evaluation is a reverse proxy.

It translates gRPC into RESTful JSON APIs.

Index

Constants

This section is empty.

Variables

View Source
var (
	EvaluationStatus_name = map[int32]string{
		0:  "EVALUATION_STATUS_UNSPECIFIED",
		1:  "EVALUATION_STATUS_COMPLIANT",
		2:  "EVALUATION_STATUS_COMPLIANT_MANUALLY",
		3:  "EVALUATION_STATUS_NOT_COMPLIANT",
		4:  "EVALUATION_STATUS_NOT_COMPLIANT_MANUALLY",
		10: "EVALUATION_STATUS_PENDING",
	}
	EvaluationStatus_value = map[string]int32{
		"EVALUATION_STATUS_UNSPECIFIED":            0,
		"EVALUATION_STATUS_COMPLIANT":              1,
		"EVALUATION_STATUS_COMPLIANT_MANUALLY":     2,
		"EVALUATION_STATUS_NOT_COMPLIANT":          3,
		"EVALUATION_STATUS_NOT_COMPLIANT_MANUALLY": 4,
		"EVALUATION_STATUS_PENDING":                10,
	}
)

Enum value maps for EvaluationStatus.

View Source
var Evaluation_ServiceDesc = grpc.ServiceDesc{
	ServiceName: "clouditor.evaluation.v1.Evaluation",
	HandlerType: (*EvaluationServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "StartEvaluation",
			Handler:    _Evaluation_StartEvaluation_Handler,
		},
		{
			MethodName: "StopEvaluation",
			Handler:    _Evaluation_StopEvaluation_Handler,
		},
		{
			MethodName: "ListEvaluationResults",
			Handler:    _Evaluation_ListEvaluationResults_Handler,
		},
		{
			MethodName: "CreateEvaluationResult",
			Handler:    _Evaluation_CreateEvaluationResult_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "api/evaluation/evaluation.proto",
}

Evaluation_ServiceDesc is the grpc.ServiceDesc for Evaluation service. It's only intended for direct use with grpc.RegisterService, and not to be introspected or modified (even as a copy)

View Source
var File_api_evaluation_evaluation_proto protoreflect.FileDescriptor

Functions

func RegisterEvaluationHandler

func RegisterEvaluationHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error

RegisterEvaluationHandler registers the http handlers for service Evaluation to "mux". The handlers forward requests to the grpc endpoint over "conn".

func RegisterEvaluationHandlerClient

func RegisterEvaluationHandlerClient(ctx context.Context, mux *runtime.ServeMux, client EvaluationClient) error

RegisterEvaluationHandlerClient registers the http handlers for service Evaluation to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "EvaluationClient". Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "EvaluationClient" doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in "EvaluationClient" to call the correct interceptors.

func RegisterEvaluationHandlerFromEndpoint

func RegisterEvaluationHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error)

RegisterEvaluationHandlerFromEndpoint is same as RegisterEvaluationHandler but automatically dials to "endpoint" and closes the connection when "ctx" gets done.

func RegisterEvaluationHandlerServer

func RegisterEvaluationHandlerServer(ctx context.Context, mux *runtime.ServeMux, server EvaluationServer) error

RegisterEvaluationHandlerServer registers the http handlers for service Evaluation to "mux". UnaryRPC :call EvaluationServer directly. StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterEvaluationHandlerFromEndpoint instead.

func RegisterEvaluationServer

func RegisterEvaluationServer(s grpc.ServiceRegistrar, srv EvaluationServer)

Types

type CreateEvaluationResultRequest

type CreateEvaluationResultRequest struct {
	Result *EvaluationResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
	// contains filtered or unexported fields
}

func (*CreateEvaluationResultRequest) Descriptor deprecated

func (*CreateEvaluationResultRequest) Descriptor() ([]byte, []int)

Deprecated: Use CreateEvaluationResultRequest.ProtoReflect.Descriptor instead.

func (*CreateEvaluationResultRequest) GetCloudServiceId

func (req *CreateEvaluationResultRequest) GetCloudServiceId() string

GetCloudServiceId is a shortcut to implement CloudServiceRequest. It returns the cloud service ID of the inner object.

func (*CreateEvaluationResultRequest) GetResult

func (*CreateEvaluationResultRequest) ProtoMessage

func (*CreateEvaluationResultRequest) ProtoMessage()

func (*CreateEvaluationResultRequest) ProtoReflect

func (*CreateEvaluationResultRequest) Reset

func (x *CreateEvaluationResultRequest) Reset()

func (*CreateEvaluationResultRequest) String

type EvaluationClient

type EvaluationClient interface {
	// Evaluates periodically all assessment results of a cloud service id based
	// on the given catalog id. Part of the public API, also exposed as REST.
	StartEvaluation(ctx context.Context, in *StartEvaluationRequest, opts ...grpc.CallOption) (*StartEvaluationResponse, error)
	// StopEvaluation stops the evaluation for the given target of evaluation.
	// Part of the public API, also exposed as REST.
	StopEvaluation(ctx context.Context, in *StopEvaluationRequest, opts ...grpc.CallOption) (*StopEvaluationResponse, error)
	// List all evaluation results that the user can access. It can further be
	// restricted by various filtering options. Part of the public API, also
	// exposed as REST.
	ListEvaluationResults(ctx context.Context, in *ListEvaluationResultsRequest, opts ...grpc.CallOption) (*ListEvaluationResultsResponse, error)
	// Creates an evaluation result
	CreateEvaluationResult(ctx context.Context, in *CreateEvaluationResultRequest, opts ...grpc.CallOption) (*EvaluationResult, error)
}

EvaluationClient is the client API for Evaluation service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.

func NewEvaluationClient

func NewEvaluationClient(cc grpc.ClientConnInterface) EvaluationClient

type EvaluationResult

type EvaluationResult struct {

	// Evaluation result id
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// The Cloud Service ID the evaluation belongs to
	CloudServiceId string `protobuf:"bytes,2,opt,name=cloud_service_id,json=cloudServiceId,proto3" json:"cloud_service_id,omitempty"`
	// The control id the evaluation was based on
	ControlId string `protobuf:"bytes,3,opt,name=control_id,json=controlId,proto3" json:"control_id,omitempty"`
	// The category the evaluated control belongs to
	ControlCategoryName string `protobuf:"bytes,4,opt,name=control_category_name,json=controlCategoryName,proto3" json:"control_category_name,omitempty"`
	// The catalog the evaluated control belongs to
	ControlCatalogId string `protobuf:"bytes,5,opt,name=control_catalog_id,json=controlCatalogId,proto3" json:"control_catalog_id,omitempty"`
	// Optionally, specifies the parent control ID, if this is a sub-control
	ParentControlId *string `protobuf:"bytes,6,opt,name=parent_control_id,json=parentControlId,proto3,oneof" json:"parent_control_id,omitempty"`
	// Evaluation status
	Status EvaluationStatus `protobuf:"varint,7,opt,name=status,proto3,enum=clouditor.evaluation.v1.EvaluationStatus" json:"status,omitempty"`
	// Time of evaluation
	Timestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=timestamp,proto3" json:"timestamp,omitempty" gorm:"serializer:timestamppb;type:datetime"`
	// List of assessment results because of which the evaluation status is not
	// 'compliant'
	FailingAssessmentResultIds []string `` /* 166-byte string literal not displayed */
	Comment                    *string  `protobuf:"bytes,10,opt,name=comment,proto3,oneof" json:"comment,omitempty"`
	// Optional, but required if the status is one of the "manually" ones. This
	// denotes how long the (manual) created evaluation result is valid. During
	// this time, no automatic results are generated for the specific control.
	ValidUntil *timestamppb.Timestamp `` /* 142-byte string literal not displayed */
	// contains filtered or unexported fields
}

A evaluation result resource, representing the result after evaluating the cloud service with a specific control cloud_service_id, category_name and catalog_id are necessary to get the corresponding TargetOfEvaluation

func (*EvaluationResult) Descriptor deprecated

func (*EvaluationResult) Descriptor() ([]byte, []int)

Deprecated: Use EvaluationResult.ProtoReflect.Descriptor instead.

func (*EvaluationResult) GetCloudServiceId

func (x *EvaluationResult) GetCloudServiceId() string

func (*EvaluationResult) GetComment

func (x *EvaluationResult) GetComment() string

func (*EvaluationResult) GetControlCatalogId

func (x *EvaluationResult) GetControlCatalogId() string

func (*EvaluationResult) GetControlCategoryName

func (x *EvaluationResult) GetControlCategoryName() string

func (*EvaluationResult) GetControlId

func (x *EvaluationResult) GetControlId() string

func (*EvaluationResult) GetFailingAssessmentResultIds

func (x *EvaluationResult) GetFailingAssessmentResultIds() []string

func (*EvaluationResult) GetId

func (x *EvaluationResult) GetId() string

func (*EvaluationResult) GetParentControlId

func (x *EvaluationResult) GetParentControlId() string

func (*EvaluationResult) GetStatus

func (x *EvaluationResult) GetStatus() EvaluationStatus

func (*EvaluationResult) GetTimestamp

func (x *EvaluationResult) GetTimestamp() *timestamppb.Timestamp

func (*EvaluationResult) GetValidUntil

func (x *EvaluationResult) GetValidUntil() *timestamppb.Timestamp

func (*EvaluationResult) ProtoMessage

func (*EvaluationResult) ProtoMessage()

func (*EvaluationResult) ProtoReflect

func (x *EvaluationResult) ProtoReflect() protoreflect.Message

func (*EvaluationResult) Reset

func (x *EvaluationResult) Reset()

func (*EvaluationResult) String

func (x *EvaluationResult) String() string

type EvaluationServer

type EvaluationServer interface {
	// Evaluates periodically all assessment results of a cloud service id based
	// on the given catalog id. Part of the public API, also exposed as REST.
	StartEvaluation(context.Context, *StartEvaluationRequest) (*StartEvaluationResponse, error)
	// StopEvaluation stops the evaluation for the given target of evaluation.
	// Part of the public API, also exposed as REST.
	StopEvaluation(context.Context, *StopEvaluationRequest) (*StopEvaluationResponse, error)
	// List all evaluation results that the user can access. It can further be
	// restricted by various filtering options. Part of the public API, also
	// exposed as REST.
	ListEvaluationResults(context.Context, *ListEvaluationResultsRequest) (*ListEvaluationResultsResponse, error)
	// Creates an evaluation result
	CreateEvaluationResult(context.Context, *CreateEvaluationResultRequest) (*EvaluationResult, error)
	// contains filtered or unexported methods
}

EvaluationServer is the server API for Evaluation service. All implementations must embed UnimplementedEvaluationServer for forward compatibility

type EvaluationStatus

type EvaluationStatus int32
const (
	EvaluationStatus_EVALUATION_STATUS_UNSPECIFIED            EvaluationStatus = 0
	EvaluationStatus_EVALUATION_STATUS_COMPLIANT              EvaluationStatus = 1
	EvaluationStatus_EVALUATION_STATUS_COMPLIANT_MANUALLY     EvaluationStatus = 2
	EvaluationStatus_EVALUATION_STATUS_NOT_COMPLIANT          EvaluationStatus = 3
	EvaluationStatus_EVALUATION_STATUS_NOT_COMPLIANT_MANUALLY EvaluationStatus = 4
	EvaluationStatus_EVALUATION_STATUS_PENDING                EvaluationStatus = 10
)

func (EvaluationStatus) Descriptor

func (EvaluationStatus) Enum

func (EvaluationStatus) EnumDescriptor deprecated

func (EvaluationStatus) EnumDescriptor() ([]byte, []int)

Deprecated: Use EvaluationStatus.Descriptor instead.

func (EvaluationStatus) Number

func (EvaluationStatus) String

func (x EvaluationStatus) String() string

func (EvaluationStatus) Type

type ListEvaluationResultsRequest

type ListEvaluationResultsRequest struct {
	Filter *ListEvaluationResultsRequest_Filter `protobuf:"bytes,1,opt,name=filter,proto3,oneof" json:"filter,omitempty"`
	// Optional. Latest results grouped by control_id.
	LatestByControlId *bool  `protobuf:"varint,2,opt,name=latest_by_control_id,json=latestByControlId,proto3,oneof" json:"latest_by_control_id,omitempty"`
	PageSize          int32  `protobuf:"varint,10,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	PageToken         string `protobuf:"bytes,11,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	OrderBy           string `protobuf:"bytes,12,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	Asc               bool   `protobuf:"varint,13,opt,name=asc,proto3" json:"asc,omitempty"`
	// contains filtered or unexported fields
}

func (*ListEvaluationResultsRequest) Descriptor deprecated

func (*ListEvaluationResultsRequest) Descriptor() ([]byte, []int)

Deprecated: Use ListEvaluationResultsRequest.ProtoReflect.Descriptor instead.

func (*ListEvaluationResultsRequest) GetAsc

func (x *ListEvaluationResultsRequest) GetAsc() bool

func (*ListEvaluationResultsRequest) GetFilter

func (*ListEvaluationResultsRequest) GetLatestByControlId

func (x *ListEvaluationResultsRequest) GetLatestByControlId() bool

func (*ListEvaluationResultsRequest) GetOrderBy

func (x *ListEvaluationResultsRequest) GetOrderBy() string

func (*ListEvaluationResultsRequest) GetPageSize

func (x *ListEvaluationResultsRequest) GetPageSize() int32

func (*ListEvaluationResultsRequest) GetPageToken

func (x *ListEvaluationResultsRequest) GetPageToken() string

func (*ListEvaluationResultsRequest) ProtoMessage

func (*ListEvaluationResultsRequest) ProtoMessage()

func (*ListEvaluationResultsRequest) ProtoReflect

func (*ListEvaluationResultsRequest) Reset

func (x *ListEvaluationResultsRequest) Reset()

func (*ListEvaluationResultsRequest) String

type ListEvaluationResultsRequest_Filter

type ListEvaluationResultsRequest_Filter struct {

	// Optional. Lists only evaluation results for a specific cloud service.
	CloudServiceId *string `protobuf:"bytes,1,opt,name=cloud_service_id,json=cloudServiceId,proto3,oneof" json:"cloud_service_id,omitempty"`
	// Optional. Lists only evaluation results for a specific catalog.
	CatalogId *string `protobuf:"bytes,2,opt,name=catalog_id,json=catalogId,proto3,oneof" json:"catalog_id,omitempty"`
	// Optional. Lists only evaluation results for a specific control id.
	ControlId *string `protobuf:"bytes,3,opt,name=control_id,json=controlId,proto3,oneof" json:"control_id,omitempty"`
	// Optional. Lists all evaluation results for the given initial control id
	// substring, e.g., if the substring 'CMK-01.' is given it returns the
	// controls CMK-01.1B, CMK-01.1S, CMK-01.1H.
	SubControls *string `protobuf:"bytes,4,opt,name=sub_controls,json=subControls,proto3,oneof" json:"sub_controls,omitempty"`
	// Optional. Lists only results for parent controls
	ParentsOnly *bool `protobuf:"varint,5,opt,name=parents_only,json=parentsOnly,proto3,oneof" json:"parents_only,omitempty"`
	// Optional. Lists only manual results in their validity period
	ValidManualOnly *bool `protobuf:"varint,6,opt,name=valid_manual_only,json=validManualOnly,proto3,oneof" json:"valid_manual_only,omitempty"`
	// contains filtered or unexported fields
}

func (*ListEvaluationResultsRequest_Filter) Descriptor deprecated

func (*ListEvaluationResultsRequest_Filter) Descriptor() ([]byte, []int)

Deprecated: Use ListEvaluationResultsRequest_Filter.ProtoReflect.Descriptor instead.

func (*ListEvaluationResultsRequest_Filter) GetCatalogId

func (x *ListEvaluationResultsRequest_Filter) GetCatalogId() string

func (*ListEvaluationResultsRequest_Filter) GetCloudServiceId

func (x *ListEvaluationResultsRequest_Filter) GetCloudServiceId() string

func (*ListEvaluationResultsRequest_Filter) GetControlId

func (x *ListEvaluationResultsRequest_Filter) GetControlId() string

func (*ListEvaluationResultsRequest_Filter) GetParentsOnly

func (x *ListEvaluationResultsRequest_Filter) GetParentsOnly() bool

func (*ListEvaluationResultsRequest_Filter) GetSubControls

func (x *ListEvaluationResultsRequest_Filter) GetSubControls() string

func (*ListEvaluationResultsRequest_Filter) GetValidManualOnly

func (x *ListEvaluationResultsRequest_Filter) GetValidManualOnly() bool

func (*ListEvaluationResultsRequest_Filter) ProtoMessage

func (*ListEvaluationResultsRequest_Filter) ProtoMessage()

func (*ListEvaluationResultsRequest_Filter) ProtoReflect

func (*ListEvaluationResultsRequest_Filter) Reset

func (*ListEvaluationResultsRequest_Filter) String

type ListEvaluationResultsResponse

type ListEvaluationResultsResponse struct {
	Results       []*EvaluationResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
	NextPageToken string              `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	// contains filtered or unexported fields
}

func (*ListEvaluationResultsResponse) Descriptor deprecated

func (*ListEvaluationResultsResponse) Descriptor() ([]byte, []int)

Deprecated: Use ListEvaluationResultsResponse.ProtoReflect.Descriptor instead.

func (*ListEvaluationResultsResponse) GetNextPageToken

func (x *ListEvaluationResultsResponse) GetNextPageToken() string

func (*ListEvaluationResultsResponse) GetResults

func (*ListEvaluationResultsResponse) ProtoMessage

func (*ListEvaluationResultsResponse) ProtoMessage()

func (*ListEvaluationResultsResponse) ProtoReflect

func (*ListEvaluationResultsResponse) Reset

func (x *ListEvaluationResultsResponse) Reset()

func (*ListEvaluationResultsResponse) String

type StartEvaluationRequest

type StartEvaluationRequest struct {
	CloudServiceId string `protobuf:"bytes,1,opt,name=cloud_service_id,json=cloudServiceId,proto3" json:"cloud_service_id,omitempty"`
	CatalogId      string `protobuf:"bytes,2,opt,name=catalog_id,json=catalogId,proto3" json:"catalog_id,omitempty"`
	// The interval time in minutes the evaluation executes periodically. The
	// default interval is set to 5 minutes.
	Interval *int32 `protobuf:"varint,3,opt,name=interval,proto3,oneof" json:"interval,omitempty"`
	// contains filtered or unexported fields
}

func (*StartEvaluationRequest) Descriptor deprecated

func (*StartEvaluationRequest) Descriptor() ([]byte, []int)

Deprecated: Use StartEvaluationRequest.ProtoReflect.Descriptor instead.

func (*StartEvaluationRequest) GetCatalogId

func (x *StartEvaluationRequest) GetCatalogId() string

func (*StartEvaluationRequest) GetCloudServiceId

func (x *StartEvaluationRequest) GetCloudServiceId() string

func (*StartEvaluationRequest) GetInterval

func (x *StartEvaluationRequest) GetInterval() int32

func (*StartEvaluationRequest) ProtoMessage

func (*StartEvaluationRequest) ProtoMessage()

func (*StartEvaluationRequest) ProtoReflect

func (x *StartEvaluationRequest) ProtoReflect() protoreflect.Message

func (*StartEvaluationRequest) Reset

func (x *StartEvaluationRequest) Reset()

func (*StartEvaluationRequest) String

func (x *StartEvaluationRequest) String() string

type StartEvaluationResponse

type StartEvaluationResponse struct {
	Successful bool `protobuf:"varint,1,opt,name=successful,proto3" json:"successful,omitempty"`
	// contains filtered or unexported fields
}

func (*StartEvaluationResponse) Descriptor deprecated

func (*StartEvaluationResponse) Descriptor() ([]byte, []int)

Deprecated: Use StartEvaluationResponse.ProtoReflect.Descriptor instead.

func (*StartEvaluationResponse) GetSuccessful

func (x *StartEvaluationResponse) GetSuccessful() bool

func (*StartEvaluationResponse) ProtoMessage

func (*StartEvaluationResponse) ProtoMessage()

func (*StartEvaluationResponse) ProtoReflect

func (x *StartEvaluationResponse) ProtoReflect() protoreflect.Message

func (*StartEvaluationResponse) Reset

func (x *StartEvaluationResponse) Reset()

func (*StartEvaluationResponse) String

func (x *StartEvaluationResponse) String() string

type StopEvaluationRequest

type StopEvaluationRequest struct {
	CloudServiceId string `protobuf:"bytes,1,opt,name=cloud_service_id,json=cloudServiceId,proto3" json:"cloud_service_id,omitempty"`
	CatalogId      string `protobuf:"bytes,2,opt,name=catalog_id,json=catalogId,proto3" json:"catalog_id,omitempty"`
	// contains filtered or unexported fields
}

func (*StopEvaluationRequest) Descriptor deprecated

func (*StopEvaluationRequest) Descriptor() ([]byte, []int)

Deprecated: Use StopEvaluationRequest.ProtoReflect.Descriptor instead.

func (*StopEvaluationRequest) GetCatalogId

func (x *StopEvaluationRequest) GetCatalogId() string

func (*StopEvaluationRequest) GetCloudServiceId

func (x *StopEvaluationRequest) GetCloudServiceId() string

func (*StopEvaluationRequest) ProtoMessage

func (*StopEvaluationRequest) ProtoMessage()

func (*StopEvaluationRequest) ProtoReflect

func (x *StopEvaluationRequest) ProtoReflect() protoreflect.Message

func (*StopEvaluationRequest) Reset

func (x *StopEvaluationRequest) Reset()

func (*StopEvaluationRequest) String

func (x *StopEvaluationRequest) String() string

type StopEvaluationResponse

type StopEvaluationResponse struct {
	// contains filtered or unexported fields
}

func (*StopEvaluationResponse) Descriptor deprecated

func (*StopEvaluationResponse) Descriptor() ([]byte, []int)

Deprecated: Use StopEvaluationResponse.ProtoReflect.Descriptor instead.

func (*StopEvaluationResponse) ProtoMessage

func (*StopEvaluationResponse) ProtoMessage()

func (*StopEvaluationResponse) ProtoReflect

func (x *StopEvaluationResponse) ProtoReflect() protoreflect.Message

func (*StopEvaluationResponse) Reset

func (x *StopEvaluationResponse) Reset()

func (*StopEvaluationResponse) String

func (x *StopEvaluationResponse) String() string

type UnimplementedEvaluationServer

type UnimplementedEvaluationServer struct {
}

UnimplementedEvaluationServer must be embedded to have forward compatible implementations.

func (UnimplementedEvaluationServer) CreateEvaluationResult

func (UnimplementedEvaluationServer) StartEvaluation

func (UnimplementedEvaluationServer) StopEvaluation

type UnsafeEvaluationServer

type UnsafeEvaluationServer interface {
	// contains filtered or unexported methods
}

UnsafeEvaluationServer may be embedded to opt out of forward compatibility for this service. Use of this interface is not recommended, as added methods to EvaluationServer will result in compilation errors.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL