@@ -20,6 +20,7 @@ import (
2020 "context"
2121 "fmt"
2222 "sync"
23+ "time"
2324
2425 compute "google.golang.org/api/compute/v1"
2526 "k8s.io/kops/upup/pkg/fi/cloudup/gce"
@@ -28,14 +29,20 @@ import (
2829type instanceGroupManagerClient struct {
2930 // instanceGroupManagers are instanceGroupManagers keyed by project, zone, and name.
3031 instanceGroupManagers map [string ]map [string ]map [string ]* compute.InstanceGroupManager
32+ // managedInstances are managedInstances keyed by project, zone, and name.
33+ managedInstances map [string ]map [string ]map [string ]* compute.ManagedInstance
34+ // instanceClient is the client for instances.
35+ instanceClient gce.InstanceClient
3136 sync.Mutex
3237}
3338
3439var _ gce.InstanceGroupManagerClient = & instanceGroupManagerClient {}
3540
36- func newInstanceGroupManagerClient () * instanceGroupManagerClient {
41+ func newInstanceGroupManagerClient (instanceClient gce. InstanceClient ) * instanceGroupManagerClient {
3742 return & instanceGroupManagerClient {
3843 instanceGroupManagers : map [string ]map [string ]map [string ]* compute.InstanceGroupManager {},
44+ managedInstances : map [string ]map [string ]map [string ]* compute.ManagedInstance {},
45+ instanceClient : instanceClient ,
3946 }
4047}
4148
@@ -56,18 +63,40 @@ func (c *instanceGroupManagerClient) All() map[string]interface{} {
5663func (c * instanceGroupManagerClient ) Insert (project , zone string , igm * compute.InstanceGroupManager ) (* compute.Operation , error ) {
5764 c .Lock ()
5865 defer c .Unlock ()
59- zones , ok := c .instanceGroupManagers [project ]
66+ igmZones , ok := c .instanceGroupManagers [project ]
6067 if ! ok {
61- zones = map [string ]map [string ]* compute.InstanceGroupManager {}
62- c .instanceGroupManagers [project ] = zones
68+ igmZones = map [string ]map [string ]* compute.InstanceGroupManager {}
69+ c .instanceGroupManagers [project ] = igmZones
6370 }
64- igms , ok := zones [zone ]
71+ igms , ok := igmZones [zone ]
6572 if ! ok {
6673 igms = map [string ]* compute.InstanceGroupManager {}
67- zones [zone ] = igms
74+ igmZones [zone ] = igms
6875 }
6976 igm .SelfLink = fmt .Sprintf ("https://www.googleapis.com/compute/v1/projects/%s/zones/%s/instanceGroupManagers/%s" , project , zone , igm .Name )
7077 igms [igm .Name ] = igm
78+
79+ newInstance := & compute.Instance {
80+ Name : igm .Name ,
81+ }
82+
83+ c .instanceClient .Insert (project , zone , newInstance )
84+
85+ instanceZones , ok := c .managedInstances [project ]
86+ if ! ok {
87+ instanceZones = map [string ]map [string ]* compute.ManagedInstance {}
88+ c .managedInstances [project ] = instanceZones
89+ }
90+ _ , ok = instanceZones [zone ]
91+ if ! ok {
92+ instanceZones [zone ] = map [string ]* compute.ManagedInstance {}
93+ }
94+
95+ c.managedInstances [project ][zone ][igm .Name ] = & compute.ManagedInstance {
96+ Name : igm .Name ,
97+ Instance : fmt .Sprintf ("https://www.googleapis.com/compute/v1/projects/%s/zones/%s/instances/%s" , project , zone , igm .Name ),
98+ }
99+
71100 return doneOperation (), nil
72101}
73102
@@ -126,8 +155,23 @@ func (c *instanceGroupManagerClient) List(ctx context.Context, project, zone str
126155}
127156
128157func (c * instanceGroupManagerClient ) ListManagedInstances (ctx context.Context , project , zone , name string ) ([]* compute.ManagedInstance , error ) {
129- var instances []* compute.ManagedInstance
130- return instances , nil
158+ c .Lock ()
159+ defer c .Unlock ()
160+
161+ zones , ok := c .managedInstances [project ]
162+ if ! ok {
163+ return nil , nil
164+ }
165+ instances , ok := zones [zone ]
166+ if ! ok {
167+ return nil , nil
168+ }
169+
170+ var l []* compute.ManagedInstance
171+ for _ , instance := range instances {
172+ l = append (l , instance )
173+ }
174+ return l , nil
131175}
132176
133177func (c * instanceGroupManagerClient ) RecreateInstances (project , zone , name , id string ) (* compute.Operation , error ) {
@@ -143,5 +187,28 @@ func (c *instanceGroupManagerClient) SetInstanceTemplate(project, zone, name, in
143187}
144188
145189func (c * instanceGroupManagerClient ) Resize (project , zone , name string , newSize int64 ) (* compute.Operation , error ) {
190+ go func () {
191+ if newSize == 0 {
192+ // Simulates a Long Operation when resizing
193+ time .Sleep (20 * time .Millisecond )
194+
195+ c .Lock ()
196+ defer c .Unlock ()
197+
198+ // Delete all Instances from GCE
199+ for _ , zones := range c .managedInstances [project ] {
200+ for _ , instance := range zones {
201+ c .instanceClient .Delete (project , zone , instance .Name )
202+ }
203+ }
204+
205+ zones , ok := c .managedInstances [project ]
206+ if ! ok {
207+ return
208+ }
209+
210+ zones [zone ] = nil
211+ }
212+ }()
146213 return doneOperation (), nil
147214}
0 commit comments