diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 494ecc6587..2ae9e9e804 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -898,6 +898,10 @@ func getModelItemDetails(manager IModelManager, item IModel, ctx context.Context } } +func GetItemDetails(manager IModelManager, item IModel, ctx context.Context, userCred mcclient.TokenCredential) (jsonutils.JSONObject, error) { + return getItemDetails(manager, item, ctx, userCred, nil) +} + func getItemDetails(manager IModelManager, item IModel, ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { metaFields, excludeFields := GetDetailFields(manager, userCred) fieldFilter := jsonutils.GetQueryStringArray(query, "field") diff --git a/pkg/cloudproxy/agent/ssh/client.go b/pkg/cloudproxy/agent/ssh/client.go index 5f19a11036..75e4560ea0 100644 --- a/pkg/cloudproxy/agent/ssh/client.go +++ b/pkg/cloudproxy/agent/ssh/client.go @@ -186,10 +186,17 @@ func (c *Client) runClientState(ctx context.Context, sshClientC chan *ssh.Client default: } + cc := c.cc tmoCtx, _ := context.WithTimeout(ctx, 31*time.Second) - sshc, err := c.cc.ConnectContext(tmoCtx) + sshc, err := cc.ConnectContext(tmoCtx) if err != nil { - log.Errorf("ssh connect: %v", err) + log.Errorf("ssh connect: %s@%s, port %d: %v", cc.Username, cc.Host, cc.Port, err) + waitTmo := time.NewTimer(13 * time.Second) + select { + case <-ctx.Done(): + return + case <-waitTmo.C: + } continue } diff --git a/pkg/cloudproxy/models/forwards.go b/pkg/cloudproxy/models/forwards.go index 5949c57a36..9fcce616ca 100644 --- a/pkg/cloudproxy/models/forwards.go +++ b/pkg/cloudproxy/models/forwards.go @@ -256,7 +256,11 @@ func (man *SForwardManager) PerformCreateFromServer(ctx context.Context, userCre data, err = man.validatePortReq(ctx, typ, -1, agentId, epId, data) } - forward := &SForward{} + forwardObj, err := db.NewModelObject(man) + if err != nil { + return nil, httperrors.NewGeneralError(err) + } + forward := forwardObj.(*SForward) if err := data.Unmarshal(forward); err != nil { return nil, httperrors.NewServerError("unmarshal create params: %v", err) } @@ -267,7 +271,7 @@ func (man *SForwardManager) PerformCreateFromServer(ctx context.Context, userCre return nil, httperrors.NewServerError("database insertion error: %v", err) } - return jsonutils.Marshal(forward), nil + return db.GetItemDetails(man, forward, ctx, userCred) } func (man *SForwardManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { diff --git a/pkg/compute/models/guest_sshable.go b/pkg/compute/models/guest_sshable.go index a2cd23d04b..4ce414fb59 100644 --- a/pkg/compute/models/guest_sshable.go +++ b/pkg/compute/models/guest_sshable.go @@ -207,9 +207,22 @@ func (guest *SGuest) sshableTryEach( res, err := cloudproxy_module.Forwards.PerformClassAction(sess, "create-from-server", fwdCreateParams) if err == nil { var fwd cloudproxy_api.ForwardDetails - if err := res.Unmarshal(&fwd); err == nil { - if ok := guest.sshableTryForward(ctx, tryData, &fwd); ok { - return nil + if err := res.Unmarshal(&fwd); err != nil { + log.Errorf("unmarshal fwd details: %q", res.String()) + } + + tmo := time.NewTimer(13 * time.Second) + tick := time.NewTicker(3 * time.Second) + for { + select { + case <-tmo.C: + break + case <-tick.C: + if ok := guest.sshableTryForward(ctx, tryData, &fwd); ok { + return nil + } + case <-ctx.Done(): + break } } } else {