@@ -45,10 +45,11 @@ const (
45
45
)
46
46
47
47
type InstanceInfo struct {
48
- project string
49
- zone string
50
- name string
51
- machineType string
48
+ project string
49
+ architecture string
50
+ zone string
51
+ name string
52
+ machineType string
52
53
53
54
// External IP is filled in after instance creation
54
55
externalIP string
@@ -68,12 +69,13 @@ func (i *InstanceInfo) GetNodeID() string {
68
69
return common .CreateNodeID (i .project , i .zone , i .name )
69
70
}
70
71
71
- func CreateInstanceInfo (project , instanceZone , name , machineType string , cs * compute.Service ) (* InstanceInfo , error ) {
72
+ func CreateInstanceInfo (project , instanceArchitecture , instanceZone , name , machineType string , cs * compute.Service ) (* InstanceInfo , error ) {
72
73
return & InstanceInfo {
73
- project : project ,
74
- zone : instanceZone ,
75
- name : name ,
76
- machineType : machineType ,
74
+ project : project ,
75
+ architecture : instanceArchitecture ,
76
+ zone : instanceZone ,
77
+ name : name ,
78
+ machineType : machineType ,
77
79
78
80
computeService : cs ,
79
81
}, nil
@@ -92,7 +94,7 @@ func (i *InstanceInfo) CreateOrGetInstance(imageURL, serviceAccount string) erro
92
94
return fmt .Errorf ("Failed to create firewall rule: %v" , err )
93
95
}
94
96
95
- inst := & compute.Instance {
97
+ newInst := & compute.Instance {
96
98
Name : i .name ,
97
99
MachineType : fmt .Sprintf ("zones/%s/machineTypes/%s" , i .zone , i .machineType ),
98
100
NetworkInterfaces : []* compute.NetworkInterface {
@@ -121,20 +123,43 @@ func (i *InstanceInfo) CreateOrGetInstance(imageURL, serviceAccount string) erro
121
123
Email : serviceAccount ,
122
124
Scopes : []string {"https://www.googleapis.com/auth/cloud-platform" },
123
125
}
124
- inst .ServiceAccounts = []* compute.ServiceAccount {saObj }
126
+ newInst .ServiceAccounts = []* compute.ServiceAccount {saObj }
125
127
126
128
if pubkey , ok := os .LookupEnv ("JENKINS_GCE_SSH_PUBLIC_KEY_FILE" ); ok {
127
129
klog .V (4 ).Infof ("JENKINS_GCE_SSH_PUBLIC_KEY_FILE set to %v, adding public key to Instance" , pubkey )
128
130
meta , err := generateMetadataWithPublicKey (pubkey )
129
131
if err != nil {
130
132
return err
131
133
}
132
- inst .Metadata = meta
134
+ newInst .Metadata = meta
133
135
}
134
136
135
- if _ , err := i .computeService .Instances .Get (i .project , i .zone , inst .Name ).Do (); err != nil {
136
- op , err := i .computeService .Instances .Insert (i .project , i .zone , inst ).Do ()
137
- klog .V (4 ).Infof ("Inserted instance %v in project: %v, zone: %v" , inst .Name , i .project , i .zone )
137
+ // If instance exists but machine-type doesn't match, delete instance
138
+ curInst , _ := i .computeService .Instances .Get (i .project , i .zone , newInst .Name ).Do ()
139
+ if curInst != nil {
140
+ if ! strings .Contains (curInst .MachineType , newInst .MachineType ) {
141
+ klog .V (4 ).Infof ("Instance machine type doesn't match the required one. Delete instance." )
142
+ if _ , err := i .computeService .Instances .Delete (i .project , i .zone , i .name ).Do (); err != nil {
143
+ return err
144
+ }
145
+
146
+ then := time .Now ()
147
+ err := wait .Poll (15 * time .Second , 5 * time .Minute , func () (bool , error ) {
148
+ klog .V (2 ).Infof ("Waiting for instance to be deleted. %v elapsed" , time .Since (then ))
149
+ if curInst , _ = i .computeService .Instances .Get (i .project , i .zone , i .name ).Do (); curInst != nil {
150
+ return false , nil
151
+ }
152
+ return true , nil
153
+ })
154
+ if err != nil {
155
+ return err
156
+ }
157
+ }
158
+ }
159
+
160
+ if curInst == nil {
161
+ op , err := i .computeService .Instances .Insert (i .project , i .zone , newInst ).Do ()
162
+ klog .V (4 ).Infof ("Inserted instance %v in project: %v, zone: %v" , newInst .Name , i .project , i .zone )
138
163
if err != nil {
139
164
ret := fmt .Sprintf ("could not create instance %s: API error: %v" , i .name , err )
140
165
if op != nil {
@@ -145,7 +170,7 @@ func (i *InstanceInfo) CreateOrGetInstance(imageURL, serviceAccount string) erro
145
170
return fmt .Errorf ("could not create instance %s: %+v" , i .name , op .Error )
146
171
}
147
172
} else {
148
- klog .V (4 ).Infof ("Compute service GOT instance %v, skipping instance creation" , inst .Name )
173
+ klog .V (4 ).Infof ("Compute service GOT instance %v, skipping instance creation" , newInst .Name )
149
174
}
150
175
151
176
then := time .Now ()
0 commit comments