python/services/cloudfunctions/cloud_function_server.go (223 lines of code) (raw):
// Copyright 2021 Google LLC. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package server
import (
"context"
"github.com/GoogleCloudPlatform/declarative-resource-client-library/dcl"
cloudfunctionspb "github.com/GoogleCloudPlatform/declarative-resource-client-library/python/proto/cloudfunctions/cloudfunctions_go_proto"
emptypb "github.com/GoogleCloudPlatform/declarative-resource-client-library/python/proto/empty_go_proto"
"github.com/GoogleCloudPlatform/declarative-resource-client-library/services/google/cloudfunctions"
)
// Server implements the gRPC interface for CloudFunction.
type CloudFunctionServer struct{}
// ProtoToCloudFunctionStatusEnum converts a CloudFunctionStatusEnum enum from its proto representation.
func ProtoToCloudfunctionsCloudFunctionStatusEnum(e cloudfunctionspb.CloudfunctionsCloudFunctionStatusEnum) *cloudfunctions.CloudFunctionStatusEnum {
if e == 0 {
return nil
}
if n, ok := cloudfunctionspb.CloudfunctionsCloudFunctionStatusEnum_name[int32(e)]; ok {
e := cloudfunctions.CloudFunctionStatusEnum(n[len("CloudFunctionStatusEnum"):])
return &e
}
return nil
}
// ProtoToCloudFunctionVPCConnectorEgressSettingsEnum converts a CloudFunctionVPCConnectorEgressSettingsEnum enum from its proto representation.
func ProtoToCloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum(e cloudfunctionspb.CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum) *cloudfunctions.CloudFunctionVPCConnectorEgressSettingsEnum {
if e == 0 {
return nil
}
if n, ok := cloudfunctionspb.CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum_name[int32(e)]; ok {
e := cloudfunctions.CloudFunctionVPCConnectorEgressSettingsEnum(n[len("CloudFunctionVPCConnectorEgressSettingsEnum"):])
return &e
}
return nil
}
// ProtoToCloudFunctionIngressSettingsEnum converts a CloudFunctionIngressSettingsEnum enum from its proto representation.
func ProtoToCloudfunctionsCloudFunctionIngressSettingsEnum(e cloudfunctionspb.CloudfunctionsCloudFunctionIngressSettingsEnum) *cloudfunctions.CloudFunctionIngressSettingsEnum {
if e == 0 {
return nil
}
if n, ok := cloudfunctionspb.CloudfunctionsCloudFunctionIngressSettingsEnum_name[int32(e)]; ok {
e := cloudfunctions.CloudFunctionIngressSettingsEnum(n[len("CloudFunctionIngressSettingsEnum"):])
return &e
}
return nil
}
// ProtoToCloudFunctionSourceRepository converts a CloudFunctionSourceRepository resource from its proto representation.
func ProtoToCloudfunctionsCloudFunctionSourceRepository(p *cloudfunctionspb.CloudfunctionsCloudFunctionSourceRepository) *cloudfunctions.CloudFunctionSourceRepository {
if p == nil {
return nil
}
obj := &cloudfunctions.CloudFunctionSourceRepository{
Url: dcl.StringOrNil(p.Url),
DeployedUrl: dcl.StringOrNil(p.DeployedUrl),
}
return obj
}
// ProtoToCloudFunctionHttpsTrigger converts a CloudFunctionHttpsTrigger resource from its proto representation.
func ProtoToCloudfunctionsCloudFunctionHttpsTrigger(p *cloudfunctionspb.CloudfunctionsCloudFunctionHttpsTrigger) *cloudfunctions.CloudFunctionHttpsTrigger {
if p == nil {
return nil
}
obj := &cloudfunctions.CloudFunctionHttpsTrigger{
Url: dcl.StringOrNil(p.Url),
}
return obj
}
// ProtoToCloudFunctionEventTrigger converts a CloudFunctionEventTrigger resource from its proto representation.
func ProtoToCloudfunctionsCloudFunctionEventTrigger(p *cloudfunctionspb.CloudfunctionsCloudFunctionEventTrigger) *cloudfunctions.CloudFunctionEventTrigger {
if p == nil {
return nil
}
obj := &cloudfunctions.CloudFunctionEventTrigger{
EventType: dcl.StringOrNil(p.EventType),
Resource: dcl.StringOrNil(p.Resource),
Service: dcl.StringOrNil(p.Service),
FailurePolicy: dcl.Bool(p.FailurePolicy),
}
return obj
}
// ProtoToCloudFunction converts a CloudFunction resource from its proto representation.
func ProtoToCloudFunction(p *cloudfunctionspb.CloudfunctionsCloudFunction) *cloudfunctions.CloudFunction {
obj := &cloudfunctions.CloudFunction{
Name: dcl.StringOrNil(p.Name),
Description: dcl.StringOrNil(p.Description),
SourceArchiveUrl: dcl.StringOrNil(p.SourceArchiveUrl),
SourceRepository: ProtoToCloudfunctionsCloudFunctionSourceRepository(p.GetSourceRepository()),
HttpsTrigger: ProtoToCloudfunctionsCloudFunctionHttpsTrigger(p.GetHttpsTrigger()),
EventTrigger: ProtoToCloudfunctionsCloudFunctionEventTrigger(p.GetEventTrigger()),
Status: ProtoToCloudfunctionsCloudFunctionStatusEnum(p.GetStatus()),
EntryPoint: dcl.StringOrNil(p.EntryPoint),
Runtime: dcl.StringOrNil(p.Runtime),
Timeout: dcl.Int64OrNil(p.Timeout),
AvailableMemoryMb: dcl.Int64OrNil(p.AvailableMemoryMb),
ServiceAccountEmail: dcl.StringOrNil(p.ServiceAccountEmail),
UpdateTime: dcl.StringOrNil(p.UpdateTime),
VersionId: dcl.Int64OrNil(p.VersionId),
Network: dcl.StringOrNil(p.Network),
MaxInstances: dcl.Int64OrNil(p.MaxInstances),
VPCConnector: dcl.StringOrNil(p.VpcConnector),
VPCConnectorEgressSettings: ProtoToCloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum(p.GetVpcConnectorEgressSettings()),
IngressSettings: ProtoToCloudfunctionsCloudFunctionIngressSettingsEnum(p.GetIngressSettings()),
Region: dcl.StringOrNil(p.Region),
Project: dcl.StringOrNil(p.Project),
}
return obj
}
// CloudFunctionStatusEnumToProto converts a CloudFunctionStatusEnum enum to its proto representation.
func CloudfunctionsCloudFunctionStatusEnumToProto(e *cloudfunctions.CloudFunctionStatusEnum) cloudfunctionspb.CloudfunctionsCloudFunctionStatusEnum {
if e == nil {
return cloudfunctionspb.CloudfunctionsCloudFunctionStatusEnum(0)
}
if v, ok := cloudfunctionspb.CloudfunctionsCloudFunctionStatusEnum_value["CloudFunctionStatusEnum"+string(*e)]; ok {
return cloudfunctionspb.CloudfunctionsCloudFunctionStatusEnum(v)
}
return cloudfunctionspb.CloudfunctionsCloudFunctionStatusEnum(0)
}
// CloudFunctionVPCConnectorEgressSettingsEnumToProto converts a CloudFunctionVPCConnectorEgressSettingsEnum enum to its proto representation.
func CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnumToProto(e *cloudfunctions.CloudFunctionVPCConnectorEgressSettingsEnum) cloudfunctionspb.CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum {
if e == nil {
return cloudfunctionspb.CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum(0)
}
if v, ok := cloudfunctionspb.CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum_value["CloudFunctionVPCConnectorEgressSettingsEnum"+string(*e)]; ok {
return cloudfunctionspb.CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum(v)
}
return cloudfunctionspb.CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnum(0)
}
// CloudFunctionIngressSettingsEnumToProto converts a CloudFunctionIngressSettingsEnum enum to its proto representation.
func CloudfunctionsCloudFunctionIngressSettingsEnumToProto(e *cloudfunctions.CloudFunctionIngressSettingsEnum) cloudfunctionspb.CloudfunctionsCloudFunctionIngressSettingsEnum {
if e == nil {
return cloudfunctionspb.CloudfunctionsCloudFunctionIngressSettingsEnum(0)
}
if v, ok := cloudfunctionspb.CloudfunctionsCloudFunctionIngressSettingsEnum_value["CloudFunctionIngressSettingsEnum"+string(*e)]; ok {
return cloudfunctionspb.CloudfunctionsCloudFunctionIngressSettingsEnum(v)
}
return cloudfunctionspb.CloudfunctionsCloudFunctionIngressSettingsEnum(0)
}
// CloudFunctionSourceRepositoryToProto converts a CloudFunctionSourceRepository resource to its proto representation.
func CloudfunctionsCloudFunctionSourceRepositoryToProto(o *cloudfunctions.CloudFunctionSourceRepository) *cloudfunctionspb.CloudfunctionsCloudFunctionSourceRepository {
if o == nil {
return nil
}
p := &cloudfunctionspb.CloudfunctionsCloudFunctionSourceRepository{
Url: dcl.ValueOrEmptyString(o.Url),
DeployedUrl: dcl.ValueOrEmptyString(o.DeployedUrl),
}
return p
}
// CloudFunctionHttpsTriggerToProto converts a CloudFunctionHttpsTrigger resource to its proto representation.
func CloudfunctionsCloudFunctionHttpsTriggerToProto(o *cloudfunctions.CloudFunctionHttpsTrigger) *cloudfunctionspb.CloudfunctionsCloudFunctionHttpsTrigger {
if o == nil {
return nil
}
p := &cloudfunctionspb.CloudfunctionsCloudFunctionHttpsTrigger{
Url: dcl.ValueOrEmptyString(o.Url),
}
return p
}
// CloudFunctionEventTriggerToProto converts a CloudFunctionEventTrigger resource to its proto representation.
func CloudfunctionsCloudFunctionEventTriggerToProto(o *cloudfunctions.CloudFunctionEventTrigger) *cloudfunctionspb.CloudfunctionsCloudFunctionEventTrigger {
if o == nil {
return nil
}
p := &cloudfunctionspb.CloudfunctionsCloudFunctionEventTrigger{
EventType: dcl.ValueOrEmptyString(o.EventType),
Resource: dcl.ValueOrEmptyString(o.Resource),
Service: dcl.ValueOrEmptyString(o.Service),
FailurePolicy: dcl.ValueOrEmptyBool(o.FailurePolicy),
}
return p
}
// CloudFunctionToProto converts a CloudFunction resource to its proto representation.
func CloudFunctionToProto(resource *cloudfunctions.CloudFunction) *cloudfunctionspb.CloudfunctionsCloudFunction {
p := &cloudfunctionspb.CloudfunctionsCloudFunction{
Name: dcl.ValueOrEmptyString(resource.Name),
Description: dcl.ValueOrEmptyString(resource.Description),
SourceArchiveUrl: dcl.ValueOrEmptyString(resource.SourceArchiveUrl),
SourceRepository: CloudfunctionsCloudFunctionSourceRepositoryToProto(resource.SourceRepository),
HttpsTrigger: CloudfunctionsCloudFunctionHttpsTriggerToProto(resource.HttpsTrigger),
EventTrigger: CloudfunctionsCloudFunctionEventTriggerToProto(resource.EventTrigger),
Status: CloudfunctionsCloudFunctionStatusEnumToProto(resource.Status),
EntryPoint: dcl.ValueOrEmptyString(resource.EntryPoint),
Runtime: dcl.ValueOrEmptyString(resource.Runtime),
Timeout: dcl.ValueOrEmptyInt64(resource.Timeout),
AvailableMemoryMb: dcl.ValueOrEmptyInt64(resource.AvailableMemoryMb),
ServiceAccountEmail: dcl.ValueOrEmptyString(resource.ServiceAccountEmail),
UpdateTime: dcl.ValueOrEmptyString(resource.UpdateTime),
VersionId: dcl.ValueOrEmptyInt64(resource.VersionId),
Network: dcl.ValueOrEmptyString(resource.Network),
MaxInstances: dcl.ValueOrEmptyInt64(resource.MaxInstances),
VpcConnector: dcl.ValueOrEmptyString(resource.VPCConnector),
VpcConnectorEgressSettings: CloudfunctionsCloudFunctionVPCConnectorEgressSettingsEnumToProto(resource.VPCConnectorEgressSettings),
IngressSettings: CloudfunctionsCloudFunctionIngressSettingsEnumToProto(resource.IngressSettings),
Region: dcl.ValueOrEmptyString(resource.Region),
Project: dcl.ValueOrEmptyString(resource.Project),
}
return p
}
// ApplyCloudFunction handles the gRPC request by passing it to the underlying CloudFunction Apply() method.
func (s *CloudFunctionServer) applyCloudFunction(ctx context.Context, c *cloudfunctions.Client, request *cloudfunctionspb.ApplyCloudfunctionsCloudFunctionRequest) (*cloudfunctionspb.CloudfunctionsCloudFunction, error) {
p := ProtoToCloudFunction(request.GetResource())
res, err := c.ApplyCloudFunction(ctx, p)
if err != nil {
return nil, err
}
r := CloudFunctionToProto(res)
return r, nil
}
// ApplyCloudFunction handles the gRPC request by passing it to the underlying CloudFunction Apply() method.
func (s *CloudFunctionServer) ApplyCloudfunctionsCloudFunction(ctx context.Context, request *cloudfunctionspb.ApplyCloudfunctionsCloudFunctionRequest) (*cloudfunctionspb.CloudfunctionsCloudFunction, error) {
cl, err := createConfigCloudFunction(ctx, request.ServiceAccountFile)
if err != nil {
return nil, err
}
return s.applyCloudFunction(ctx, cl, request)
}
// DeleteCloudFunction handles the gRPC request by passing it to the underlying CloudFunction Delete() method.
func (s *CloudFunctionServer) DeleteCloudfunctionsCloudFunction(ctx context.Context, request *cloudfunctionspb.DeleteCloudfunctionsCloudFunctionRequest) (*emptypb.Empty, error) {
cl, err := createConfigCloudFunction(ctx, request.ServiceAccountFile)
if err != nil {
return nil, err
}
return &emptypb.Empty{}, cl.DeleteCloudFunction(ctx, ProtoToCloudFunction(request.GetResource()))
}
// ListCloudFunction handles the gRPC request by passing it to the underlying CloudFunctionList() method.
func (s *CloudFunctionServer) ListCloudfunctionsCloudFunction(ctx context.Context, request *cloudfunctionspb.ListCloudfunctionsCloudFunctionRequest) (*cloudfunctionspb.ListCloudfunctionsCloudFunctionResponse, error) {
cl, err := createConfigCloudFunction(ctx, request.ServiceAccountFile)
if err != nil {
return nil, err
}
resources, err := cl.ListCloudFunction(ctx, request.Project, request.Region)
if err != nil {
return nil, err
}
var protos []*cloudfunctionspb.CloudfunctionsCloudFunction
for _, r := range resources.Items {
rp := CloudFunctionToProto(r)
protos = append(protos, rp)
}
return &cloudfunctionspb.ListCloudfunctionsCloudFunctionResponse{Items: protos}, nil
}
func createConfigCloudFunction(ctx context.Context, service_account_file string) (*cloudfunctions.Client, error) {
conf := dcl.NewConfig(dcl.WithUserAgent("dcl-test"), dcl.WithCredentialsFile(service_account_file))
return cloudfunctions.NewClient(conf), nil
}