/
create-edge-cluster.go
176 lines (152 loc) · 6.33 KB
/
create-edge-cluster.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// Package edgecluster implements edge cluster mutation required by the GraphQL transport layer
package edgecluster
import (
"context"
"errors"
"fmt"
"strings"
"github.com/decentralized-cloud/api-gateway/services/graphql/types"
"github.com/decentralized-cloud/api-gateway/services/graphql/types/edgecluster"
edgeclusterGrpcContract "github.com/decentralized-cloud/edge-cluster/contract/grpc/go"
commonErrors "github.com/micro-business/go-core/system/errors"
"go.uber.org/zap"
)
type createEdgeCluster struct {
logger *zap.Logger
resolverCreator types.ResolverCreatorContract
edgeClusterClientService edgecluster.EdgeClusterClientContract
}
type createEdgeClusterPayloadResolver struct {
resolverCreator types.ResolverCreatorContract
clientMutationId *string
edgeClusterID string
edgeClusterDetail *edgecluster.EdgeClusterDetail
cursor string
}
// NewCreateEdgeCluster creates new instance of the createEdgeCluster, setting up all dependencies and returns the instance
// ctx: Mandatory. Reference to the context
// resolverCreator: Mandatory. Reference to the resolver creator service that can create new instances of resolvers
// logger: Mandatory. Reference to the logger service
// Returns the new instance or error if something goes wrong
func NewCreateEdgeCluster(
ctx context.Context,
resolverCreator types.ResolverCreatorContract,
logger *zap.Logger,
edgeClusterClientService edgecluster.EdgeClusterClientContract) (edgecluster.CreateEdgeClusterContract, error) {
if ctx == nil {
return nil, commonErrors.NewArgumentNilError("ctx", "ctx is required")
}
if resolverCreator == nil {
return nil, commonErrors.NewArgumentNilError("resolverCreator", "resolverCreator is required")
}
if logger == nil {
return nil, commonErrors.NewArgumentNilError("logger", "logger is required")
}
if edgeClusterClientService == nil {
return nil, commonErrors.NewArgumentNilError("edgeClusterClientService", "edgeClusterClientService is required")
}
return &createEdgeCluster{
logger: logger,
resolverCreator: resolverCreator,
edgeClusterClientService: edgeClusterClientService,
}, nil
}
// NewCreateEdgeClusterPayloadResolver creates new instance of the createEdgeClusterPayloadResolvere, setting up all dependencies and returns the instance
// ctx: Mandatory. Reference to the context
// resolverCreator: Mandatory. Reference to the resolver creator service that can create new instances of resolvers
// clientMutationId: Optional. Reference to the client mutation ID to correlate the request and response
// edgeClusterID: Mandatory. The edge cluster unique identifier
// edgeClusterDetail: Mandatory. The edge cluster details
// cursor: Mandatory. The edge cluster cursor
// Returns the new instance or error if something goes wrong
func NewCreateEdgeClusterPayloadResolver(
ctx context.Context,
resolverCreator types.ResolverCreatorContract,
clientMutationId *string,
edgeClusterID string,
edgeClusterDetail *edgecluster.EdgeClusterDetail,
cursor string) (edgecluster.CreateEdgeClusterPayloadResolverContract, error) {
if ctx == nil {
return nil, commonErrors.NewArgumentNilError("ctx", "ctx is required")
}
if resolverCreator == nil {
return nil, commonErrors.NewArgumentNilError("resolverCreator", "resolverCreator is required")
}
if strings.Trim(edgeClusterID, " ") == "" {
return nil, commonErrors.NewArgumentError("edgeClusterID", "edgeClusterID is required")
}
if edgeClusterDetail == nil {
return nil, commonErrors.NewArgumentNilError("edgeClusterDetail", "edgeClusterDetail is required")
}
if strings.Trim(cursor, " ") == "" {
return nil, commonErrors.NewArgumentError("cursor", "cursor is required")
}
return &createEdgeClusterPayloadResolver{
resolverCreator: resolverCreator,
clientMutationId: clientMutationId,
edgeClusterID: edgeClusterID,
edgeClusterDetail: edgeClusterDetail,
cursor: cursor,
}, nil
}
// MutateAndGetPayload creates a new edge cluster and returns the payload contains the result of creating a new edge cluster
// ctx: Mandatory. Reference to the context
// args: Mandatory. Reference to the input argument contains edge cluster information to create
// Returns the new edge cluster payload or error if something goes wrong
func (m *createEdgeCluster) MutateAndGetPayload(
ctx context.Context,
args edgecluster.CreateEdgeClusterInputArgument) (edgecluster.CreateEdgeClusterPayloadResolverContract, error) {
connection, edgeClusterServiceClient, err := m.edgeClusterClientService.CreateClient()
if err != nil {
return nil, err
}
defer func() {
_ = connection.Close()
}()
var clusterType edgeclusterGrpcContract.ClusterType
if args.Input.ClusterType == "K3S" {
clusterType = edgeclusterGrpcContract.ClusterType_K3S
} else {
return nil, fmt.Errorf("cluster type is not supported. Cluster type: %v", args.Input.ClusterType)
}
response, err := edgeClusterServiceClient.CreateEdgeCluster(
ctx,
&edgeclusterGrpcContract.CreateEdgeClusterRequest{
EdgeCluster: &edgeclusterGrpcContract.EdgeCluster{
ProjectID: string(args.Input.ProjectID),
Name: args.Input.Name,
ClusterSecret: args.Input.ClusterSecret,
ClusterType: clusterType,
}})
if err != nil {
return nil, err
}
if response.Error != edgeclusterGrpcContract.Error_NO_ERROR {
return nil, errors.New(response.ErrorMessage)
}
return m.resolverCreator.NewCreateEdgeClusterPayloadResolver(
ctx,
args.Input.ClientMutationId,
response.EdgeClusterID,
&edgecluster.EdgeClusterDetail{
EdgeCluster: response.EdgeCluster,
ProvisionDetails: &edgeclusterGrpcContract.ProvisionDetail{},
},
response.Cursor)
}
// EdgeCluster returns the new edge cluster inforamtion
// ctx: Mandatory. Reference to the context
// Returns the new edge cluster inforamtion
func (r *createEdgeClusterPayloadResolver) EdgeCluster(ctx context.Context) (edgecluster.EdgeClusterTypeEdgeResolverContract, error) {
return r.resolverCreator.NewEdgeClusterTypeEdgeResolver(
ctx,
r.edgeClusterID,
r.cursor,
r.edgeClusterDetail)
}
// ClientMutationId returns the client mutation ID that was provided as part of the mutation request
// ctx: Mandatory. Reference to the context
// Returns the provided clientMutationId as part of mutation request
func (r *createEdgeClusterPayloadResolver) ClientMutationId(ctx context.Context) *string {
return r.clientMutationId
}