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
/
create_deployment_completed.go
94 lines (78 loc) · 3.42 KB
/
create_deployment_completed.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
package instance
import (
"context"
"fmt"
"github.com/giantswarm/microerror"
"github.com/giantswarm/azure-operator/v4/pkg/checksum"
"github.com/giantswarm/azure-operator/v4/service/controller/blobclient"
"github.com/giantswarm/azure-operator/v4/service/controller/internal/state"
"github.com/giantswarm/azure-operator/v4/service/controller/key"
)
func (r *Resource) deploymentCompletedTransition(ctx context.Context, obj interface{}, currentState state.State) (state.State, error) {
cr, err := key.ToCustomResource(obj)
if err != nil {
return DeploymentUninitialized, microerror.Mask(err)
}
deploymentsClient, err := r.ClientFactory.GetDeploymentsClient(key.CredentialNamespace(cr), key.CredentialName(cr))
if err != nil {
return DeploymentUninitialized, microerror.Mask(err)
}
groupsClient, err := r.ClientFactory.GetGroupsClient(key.CredentialNamespace(cr), key.CredentialName(cr))
if err != nil {
return currentState, microerror.Mask(err)
}
d, err := deploymentsClient.Get(ctx, key.ClusterID(&cr), key.WorkersVmssDeploymentName)
if IsDeploymentNotFound(err) {
r.Logger.LogCtx(ctx, "level", "debug", "message", "deployment should be completed but is not found")
r.Logger.LogCtx(ctx, "level", "debug", "message", "going back to DeploymentUninitialized")
return DeploymentUninitialized, nil
} else if err != nil {
return DeploymentUninitialized, microerror.Mask(err)
}
s := *d.Properties.ProvisioningState
r.Logger.LogCtx(ctx, "level", "debug", "message", fmt.Sprintf("deployment is in state '%s'", s))
group, err := groupsClient.Get(ctx, key.ClusterID(&cr))
if err != nil {
return currentState, microerror.Mask(err)
}
if key.IsSucceededProvisioningState(s) {
computedDeployment, err := r.newDeployment(ctx, cr, nil, *group.Location)
if blobclient.IsBlobNotFound(err) {
r.Logger.LogCtx(ctx, "level", "debug", "message", "ignition blob not found")
return currentState, nil
} else if err != nil {
return "", microerror.Mask(err)
} else {
desiredDeploymentTemplateChk, err := checksum.GetDeploymentTemplateChecksum(computedDeployment)
if err != nil {
return "", microerror.Mask(err)
}
desiredDeploymentParametersChk, err := checksum.GetDeploymentParametersChecksum(computedDeployment)
if err != nil {
return "", microerror.Mask(err)
}
currentDeploymentTemplateChk, err := r.GetResourceStatus(cr, DeploymentTemplateChecksum)
if err != nil {
return "", microerror.Mask(err)
}
currentDeploymentParametersChk, err := r.GetResourceStatus(cr, DeploymentParametersChecksum)
if err != nil {
return "", microerror.Mask(err)
}
if currentDeploymentTemplateChk != desiredDeploymentTemplateChk || currentDeploymentParametersChk != desiredDeploymentParametersChk {
r.Logger.LogCtx(ctx, "level", "debug", "message", "template or parameters changed")
// As current and desired state differs, start process from the beginning.
return DeploymentUninitialized, nil
}
r.Logger.LogCtx(ctx, "level", "debug", "message", "template and parameters unchanged")
return currentState, nil
}
} else if key.IsFinalProvisioningState(s) {
// Deployment has failed. Restart from beginning.
return DeploymentUninitialized, nil
}
r.Logger.LogCtx(ctx, "level", "warning", "message", "instances reconciliation process reached unexpected state")
// Normally the process should never get here. In case this happens, start
// from the beginning.
return DeploymentUninitialized, nil
}