@@ -78,8 +78,16 @@ func (m *GCEInstanceManager) ListZones() (*apiv1.ListZonesResponse, error) {
7878 }, nil
7979}
8080
81- func (m * GCEInstanceManager ) GetHostAddr (zone string , host string ) (string , error ) {
82- instance , err := m .getHostInstance (zone , host )
81+ func (m * GCEInstanceManager ) getHostAddrInner (zone string , host string , ins * compute.Instance ) (string , error ) {
82+ var instance * compute.Instance
83+ var err error
84+
85+ if ins == nil {
86+ instance , err = m .getHostInstance (zone , host )
87+ } else {
88+ instance , err = ins , nil
89+ }
90+
8391 if err != nil {
8492 return "" , err
8593 }
@@ -94,14 +102,22 @@ func (m *GCEInstanceManager) GetHostAddr(zone string, host string) (string, erro
94102 return instance .NetworkInterfaces [0 ].NetworkIP , nil
95103}
96104
97- func (m * GCEInstanceManager ) GetHostURL (zone string , host string ) (* url.URL , error ) {
98- addr , err := m .GetHostAddr (zone , host )
105+ func (m * GCEInstanceManager ) GetHostAddr (zone string , host string ) (string , error ) {
106+ return m .getHostAddrInner (zone , host , nil )
107+ }
108+
109+ func (m * GCEInstanceManager ) getHostURLInner (zone string , host string , ins * compute.Instance ) (* url.URL , error ) {
110+ addr , err := m .getHostAddrInner (zone , host , nil )
99111 if err != nil {
100112 return nil , err
101113 }
102114 return url .Parse (fmt .Sprintf ("%s://%s:%d" , m .Config .HostOrchestratorProtocol , addr , m .Config .GCP .HostOrchestratorPort ))
103115}
104116
117+ func (m * GCEInstanceManager ) GetHostURL (zone string , host string ) (* url.URL , error ) {
118+ return m .getHostURLInner (zone , host , nil )
119+ }
120+
105121const operationStatusDone = "DONE"
106122
107123func (m * GCEInstanceManager ) CreateHost (zone string , req * apiv1.CreateHostRequest , user accounts.User ) (* apiv1.Operation , error ) {
@@ -253,18 +269,27 @@ func (m *GCEInstanceManager) WaitOperation(zone string, user accounts.User, name
253269 if op .Status != operationStatusDone {
254270 return nil , errors .NewServiceUnavailableError ("Wait for operation timed out" , nil )
255271 }
256- getter := opResultGetter {Service : m .Service , Op : op }
272+ getter := opResultGetter {
273+ Service : m .Service ,
274+ Op : op ,
275+ InstanceManager : m ,
276+ Zone : zone ,
277+ }
257278 return getter .Get ()
258279}
259280
260- func (m * GCEInstanceManager ) GetHostClient (zone string , host string ) (HostClient , error ) {
261- url , err := m .GetHostURL (zone , host )
281+ func (m * GCEInstanceManager ) getHostClientInner (zone string , host string , ins * compute. Instance ) (HostClient , error ) {
282+ url , err := m .getHostURLInner (zone , host , ins )
262283 if err != nil {
263284 return nil , err
264285 }
265286 return NewNetHostClient (url , m .Config .AllowSelfSignedHostSSLCertificate ), nil
266287}
267288
289+ func (m * GCEInstanceManager ) GetHostClient (zone string , host string ) (HostClient , error ) {
290+ return m .getHostClientInner (zone , host , nil )
291+ }
292+
268293func (m * GCEInstanceManager ) getHostInstance (zone string , host string ) (* compute.Instance , error ) {
269294 ins , err := m .Service .Instances .
270295 Get (m .Config .GCP .ProjectID , zone , host ).
@@ -324,8 +349,10 @@ var (
324349)
325350
326351type opResultGetter struct {
327- Service * compute.Service
328- Op * compute.Operation
352+ Service * compute.Service
353+ Op * compute.Operation
354+ InstanceManager * GCEInstanceManager
355+ Zone string
329356}
330357
331358func (g * opResultGetter ) Get () (any , error ) {
@@ -362,7 +389,19 @@ func (g *opResultGetter) buildCreateInstanceResult() (*apiv1.HostInstance, error
362389 if err != nil {
363390 return nil , toAppError (err )
364391 }
365- return BuildHostInstance (ins )
392+
393+ host , err := BuildHostInstance (ins )
394+ if err != nil {
395+ return nil , err
396+ }
397+ client , err := g .InstanceManager .getHostClientInner (g .Zone , host .Name , ins )
398+ if err != nil {
399+ return nil , err
400+ }
401+ if err := client .WaitForHostReady (); err != nil {
402+ return nil , err
403+ }
404+ return host , nil
366405}
367406
368407// Converts compute API errors to AppError if relevant, return the same error otherwise
0 commit comments