This repository has been archived by the owner on Nov 30, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
deployment.go
120 lines (102 loc) · 4.4 KB
/
deployment.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
package instance
import (
"context"
azureresource "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-05-01/resources"
"github.com/Azure/azure-storage-blob-go/azblob"
providerv1alpha1 "github.com/giantswarm/apiextensions/pkg/apis/provider/v1alpha1"
"github.com/giantswarm/microerror"
"github.com/giantswarm/operatorkit/controller/context/resourcecanceledcontext"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"github.com/giantswarm/azure-operator/v4/pkg/helpers/vmss"
"github.com/giantswarm/azure-operator/v4/pkg/project"
"github.com/giantswarm/azure-operator/v4/service/controller/blobclient"
"github.com/giantswarm/azure-operator/v4/service/controller/controllercontext"
"github.com/giantswarm/azure-operator/v4/service/controller/key"
"github.com/giantswarm/azure-operator/v4/service/controller/resource/instance/template"
)
func (r Resource) newDeployment(ctx context.Context, obj providerv1alpha1.AzureConfig, overwrites map[string]interface{}, location string) (azureresource.Deployment, error) {
cc, err := controllercontext.FromContext(ctx)
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
err = cc.Validate()
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
prefixWorker := key.PrefixWorker()
workerBlobName := key.BlobName(&obj, prefixWorker)
cloudConfigURLs := []string{
workerBlobName,
}
distroVersion, err := key.OSVersion(cc.Release.Release)
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
for _, key := range cloudConfigURLs {
blobURL := cc.ContainerURL.NewBlockBlobURL(key)
_, err := blobURL.GetProperties(ctx, azblob.BlobAccessConditions{})
// if blob is not ready - stop instance resource reconciliation
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
}
certificateEncryptionSecretName := key.CertificateEncryptionSecretName(&obj)
encrypter, err := r.GetEncrypterObject(ctx, certificateEncryptionSecretName)
if apierrors.IsNotFound(err) {
r.Logger.LogCtx(ctx, "level", "debug", "message", "encryptionkey secret is not found", "secretname", certificateEncryptionSecretName)
resourcecanceledcontext.SetCanceled(ctx)
r.Logger.LogCtx(ctx, "level", "debug", "message", "canceling resource")
return azureresource.Deployment{}, nil
} else if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
encryptionKey := encrypter.GetEncryptionKey()
initialVector := encrypter.GetInitialVector()
storageAccountsClient, err := r.ClientFactory.GetStorageAccountsClient(key.CredentialNamespace(obj), key.CredentialName(obj))
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
groupName := key.ResourceGroupName(obj)
storageAccountName := key.StorageAccountName(&obj)
keys, err := storageAccountsClient.ListKeys(ctx, groupName, storageAccountName, "")
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
if len(*(keys.Keys)) == 0 {
return azureresource.Deployment{}, microerror.Maskf(executionFailedError, "storage account key's list is empty")
}
primaryKey := *(((*keys.Keys)[0]).Value)
containerName := key.BlobContainerName()
// Workers cloudconfig
workerBlobURL, err := blobclient.GetBlobURL(workerBlobName, containerName, storageAccountName, primaryKey, cc.ContainerURL)
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
workerCloudConfig, err := vmss.RenderCloudConfig(workerBlobURL, encryptionKey, initialVector, prefixWorker)
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
defaultParams := map[string]interface{}{
"apiLBBackendPoolID": cc.APILBBackendPoolID,
"azureOperatorVersion": project.Version(),
"clusterID": key.ClusterID(&obj),
"etcdLBBackendPoolID": cc.EtcdLBBackendPoolID,
"vmssMSIEnabled": r.Azure.MSI.Enabled,
"workerCloudConfigData": workerCloudConfig,
"workerNodes": vmss.GetWorkerNodesConfiguration(obj, distroVersion),
"workerSubnetID": cc.WorkerSubnetID,
"zones": key.AvailabilityZones(obj, location),
}
armTemplate, err := template.GetARMTemplate()
if err != nil {
return azureresource.Deployment{}, microerror.Mask(err)
}
d := azureresource.Deployment{
Properties: &azureresource.DeploymentProperties{
Mode: azureresource.Incremental,
Parameters: key.ToParameters(defaultParams, overwrites),
Template: armTemplate,
},
}
return d, nil
}