@@ -45,10 +45,11 @@ const (
4545)
4646
4747type 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
5253
5354 // External IP is filled in after instance creation
5455 externalIP string
@@ -68,12 +69,13 @@ func (i *InstanceInfo) GetNodeID() string {
6869 return common .CreateNodeID (i .project , i .zone , i .name )
6970}
7071
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 ) {
7273 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 ,
7779
7880 computeService : cs ,
7981 }, nil
@@ -92,7 +94,7 @@ func (i *InstanceInfo) CreateOrGetInstance(imageURL, serviceAccount string) erro
9294 return fmt .Errorf ("Failed to create firewall rule: %v" , err )
9395 }
9496
95- inst := & compute.Instance {
97+ newInst := & compute.Instance {
9698 Name : i .name ,
9799 MachineType : fmt .Sprintf ("zones/%s/machineTypes/%s" , i .zone , i .machineType ),
98100 NetworkInterfaces : []* compute.NetworkInterface {
@@ -121,20 +123,43 @@ func (i *InstanceInfo) CreateOrGetInstance(imageURL, serviceAccount string) erro
121123 Email : serviceAccount ,
122124 Scopes : []string {"https://www.googleapis.com/auth/cloud-platform" },
123125 }
124- inst .ServiceAccounts = []* compute.ServiceAccount {saObj }
126+ newInst .ServiceAccounts = []* compute.ServiceAccount {saObj }
125127
126128 if pubkey , ok := os .LookupEnv ("JENKINS_GCE_SSH_PUBLIC_KEY_FILE" ); ok {
127129 klog .V (4 ).Infof ("JENKINS_GCE_SSH_PUBLIC_KEY_FILE set to %v, adding public key to Instance" , pubkey )
128130 meta , err := generateMetadataWithPublicKey (pubkey )
129131 if err != nil {
130132 return err
131133 }
132- inst .Metadata = meta
134+ newInst .Metadata = meta
133135 }
134136
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 )
138163 if err != nil {
139164 ret := fmt .Sprintf ("could not create instance %s: API error: %v" , i .name , err )
140165 if op != nil {
@@ -145,7 +170,7 @@ func (i *InstanceInfo) CreateOrGetInstance(imageURL, serviceAccount string) erro
145170 return fmt .Errorf ("could not create instance %s: %+v" , i .name , op .Error )
146171 }
147172 } 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 )
149174 }
150175
151176 then := time .Now ()
0 commit comments