From f83e0894a22c4467d7e1b8de5ee9c31ad873ec00 Mon Sep 17 00:00:00 2001 From: ioito Date: Tue, 11 Oct 2022 16:46:18 +0800 Subject: [PATCH] fix(region): openstack vnc --- pkg/multicloud/openstack/instance.go | 39 +++++++++++++++++++++- pkg/multicloud/openstack/shell/instance.go | 9 ++--- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/pkg/multicloud/openstack/instance.go b/pkg/multicloud/openstack/instance.go index acde641da1..6531bab35c 100644 --- a/pkg/multicloud/openstack/instance.go +++ b/pkg/multicloud/openstack/instance.go @@ -509,12 +509,49 @@ func (region *SRegion) GetInstanceVNCUrl(instanceId string, origin bool) (*cloud return ret, nil } +func (region *SRegion) GetInstanceVNC(instanceId string, origin bool) (*cloudprovider.ServerVncOutput, error) { + params := map[string]map[string]string{ + "os-getVNCConsole": { + "type": "novnc", + }, + } + resource := fmt.Sprintf("/servers/%s/action", instanceId) + resp, err := region.ecsPost(resource, params) + if err != nil { + return nil, errors.Wrap(err, "ecsPost") + } + ret := &cloudprovider.ServerVncOutput{ + Protocol: "openstack", + InstanceId: instanceId, + Hypervisor: api.HYPERVISOR_OPENSTACK, + } + + ret.Url, err = resp.GetString("console", "url") + if err != nil { + return nil, errors.Wrapf(err, "remote_console") + } + + if origin { + return ret, nil + } + + token := string([]byte(ret.Url)[len(ret.Url)-36:]) + vncUrl, _ := url.Parse(ret.Url) + ret.Url = fmt.Sprintf("ws://%s?token=%s", vncUrl.Host, token) + ret.Protocol = "vnc" + return ret, nil +} + func (instance *SInstance) GetVNCInfo(input *cloudprovider.ServerVncInput) (*cloudprovider.ServerVncOutput, error) { origin := false if input != nil { origin = input.Origin } - return instance.host.zone.region.GetInstanceVNCUrl(instance.Id, origin) + ret, err := instance.host.zone.region.GetInstanceVNCUrl(instance.Id, origin) + if err == nil { + return ret, nil + } + return instance.host.zone.region.GetInstanceVNC(instance.Id, origin) } func (instance *SInstance) DeployVM(ctx context.Context, name string, username string, password string, publicKey string, deleteKeypair bool, description string) error { diff --git a/pkg/multicloud/openstack/shell/instance.go b/pkg/multicloud/openstack/shell/instance.go index caeabc734b..3e3ad6595f 100644 --- a/pkg/multicloud/openstack/shell/instance.go +++ b/pkg/multicloud/openstack/shell/instance.go @@ -15,8 +15,6 @@ package shell import ( - "fmt" - "yunion.io/x/onecloud/pkg/multicloud/openstack" "yunion.io/x/onecloud/pkg/util/shellutils" ) @@ -66,11 +64,14 @@ func init() { }) shellutils.R(&InstanceOptions{}, "instance-vnc", "Show instance vnc url", func(cli *openstack.SRegion, args *InstanceOptions) error { - url, err := cli.GetInstanceVNCUrl(args.ID, false) + ret, err := cli.GetInstanceVNCUrl(args.ID, true) + if err != nil { + ret, err = cli.GetInstanceVNC(args.ID, true) + } if err != nil { return err } - fmt.Println(url) + printObject(ret) return nil })