/
wssd.go
115 lines (97 loc) · 3.2 KB
/
wssd.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
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the Apache v2.0 License.
package etcdcluster
import (
"context"
"fmt"
wssdcloudclient "github.com/microsoft/moc-sdk-for-go/pkg/client"
"github.com/microsoft/moc-sdk-for-go/services/cloud"
"github.com/microsoft/moc/pkg/auth"
"github.com/microsoft/moc/pkg/errors"
wssdcloudcloud "github.com/microsoft/moc/rpc/cloudagent/cloud"
wssdcloudcommon "github.com/microsoft/moc/rpc/common"
)
type client struct {
wssdcloudcloud.EtcdClusterAgentClient
}
// NewEtcdClusterClient creates a client session with the backend wssdcloud agent
func newEtcdClusterClient(subID string, authorizer auth.Authorizer) (*client, error) {
c, err := wssdcloudclient.GetEtcdClusterClient(&subID, authorizer)
if err != nil {
return nil, err
}
return &client{c}, nil
}
// Get
func (c *client) Get(ctx context.Context, group, name string) (*[]cloud.EtcdCluster, error) {
request, err := getEtcdClusterRequest(wssdcloudcommon.Operation_GET, group, name, nil)
if err != nil {
return nil, err
}
response, err := c.EtcdClusterAgentClient.Invoke(ctx, request)
if err != nil {
return nil, err
}
return getEtcdClustersFromResponse(response, group), nil
}
// CreateOrUpdate
func (c *client) CreateOrUpdate(ctx context.Context, group, name string, cluster *cloud.EtcdCluster) (*cloud.EtcdCluster, error) {
request, err := getEtcdClusterRequest(wssdcloudcommon.Operation_POST, group, name, cluster)
if err != nil {
return nil, err
}
response, err := c.EtcdClusterAgentClient.Invoke(ctx, request)
if err != nil {
return nil, err
}
vault := getEtcdClustersFromResponse(response, group)
if len(*vault) == 0 {
return nil, fmt.Errorf("[EtcdCluster][Create] Unexpected error: Creating an etcdcluster returned no result")
}
return &((*vault)[0]), err
}
// Delete
func (c *client) Delete(ctx context.Context, group, name string) error {
vault, err := c.Get(ctx, group, name)
if err != nil {
return err
}
if len(*vault) == 0 {
return fmt.Errorf("EtcdCluster [%s] not found", name)
}
request, err := getEtcdClusterRequest(wssdcloudcommon.Operation_DELETE, group, name, &(*vault)[0])
if err != nil {
return err
}
_, err = c.EtcdClusterAgentClient.Invoke(ctx, request)
return err
}
func getEtcdClustersFromResponse(response *wssdcloudcloud.EtcdClusterResponse, group string) *[]cloud.EtcdCluster {
vaults := []cloud.EtcdCluster{}
for _, etcdclusters := range response.GetEtcdClusters() {
vaults = append(vaults, *(getEtcdCluster(etcdclusters, group)))
}
return &vaults
}
func getEtcdClusterRequest(opType wssdcloudcommon.Operation, group, name string, vault *cloud.EtcdCluster) (*wssdcloudcloud.EtcdClusterRequest, error) {
request := &wssdcloudcloud.EtcdClusterRequest{
OperationType: opType,
EtcdClusters: []*wssdcloudcloud.EtcdCluster{},
}
if len(group) == 0 {
return nil, errors.Wrapf(errors.InvalidGroup, "Group not specified")
}
wssdetcdcluster := &wssdcloudcloud.EtcdCluster{
Name: name,
GroupName: group,
}
var err error
if vault != nil {
wssdetcdcluster, err = getWssdEtcdCluster(vault, group)
if err != nil {
return nil, err
}
}
request.EtcdClusters = append(request.EtcdClusters, wssdetcdcluster)
return request, nil
}