From f2cd8a7e2a8e6da89798ec96e9aa0eb754b5ab4d Mon Sep 17 00:00:00 2001 From: am6737 <91421697+am6737@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:44:13 +0800 Subject: [PATCH] feat(region): support custom user data in Google Cloud VM rebuild (#19124) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ServerDeployInputBase结构体添加UserData字段用于部署虚拟机时获取用户自定义数据 - docs/swagger/swagger_compute.yaml中的ServerRebuildRootInput添加user_data字段 - RequestDeployGuestOnHost方法中添加rebuild重装系统获取user_data的逻辑 --- docs/swagger/swagger_compute.yaml | 3 +++ go.mod | 2 +- go.sum | 4 ++-- pkg/apis/compute/guests.go | 5 +++++ pkg/compute/guestdrivers/managedvirtual.go | 6 ++++++ vendor/modules.txt | 2 +- .../x/cloudmux/pkg/multicloud/google/instance.go | 9 ++++++++- vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/eip.go | 1 + .../x/cloudmux/pkg/multicloud/huawei/instance.go | 2 +- 9 files changed, 28 insertions(+), 6 deletions(-) diff --git a/docs/swagger/swagger_compute.yaml b/docs/swagger/swagger_compute.yaml index 597b4509c2..d7d973de75 100644 --- a/docs/swagger/swagger_compute.yaml +++ b/docs/swagger/swagger_compute.yaml @@ -31699,6 +31699,9 @@ definitions: reset_password: type: boolean x-go-name: ResetPassword + user_data: + type: string + x-go-name: UserData required: - image_id type: object diff --git a/go.mod b/go.mod index 43f696091a..b1fab67709 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( k8s.io/client-go v0.19.3 k8s.io/cluster-bootstrap v0.19.3 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227060638-40a1db02d028 + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227093150-e2e631e15be3 yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 yunion.io/x/jsonutils v1.0.1-0.20230613121553-0f3b41e2ef19 yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361 diff --git a/go.sum b/go.sum index 5f5982948c..f499473d68 100644 --- a/go.sum +++ b/go.sum @@ -1201,8 +1201,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227060638-40a1db02d028 h1:Q04t1Xfw9uqR7ba1AJm4tERJ2qwPLysaz9Iekrb0f8U= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227060638-40a1db02d028/go.mod h1:aj1gR9PPb6eqqKOwvANe26CoZFY8ydmXy0fuvgKYXH0= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227093150-e2e631e15be3 h1:xOL1kecvOkgAkHxmjbDvqHQiDih+qS7LPPJ5r0lEZCo= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227093150-e2e631e15be3/go.mod h1:aj1gR9PPb6eqqKOwvANe26CoZFY8ydmXy0fuvgKYXH0= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 40fc29c142..8e5b413c3c 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -742,6 +742,11 @@ type ServerDeployInputBase struct { ResetPassword bool `json:"reset_password"` // 重置指定密码 Password string `json:"password"` + // 用户自定义启动脚本 + // 支持 #cloud-config yaml 格式及shell脚本 + // 支持特殊user data平台: Aliyun, Qcloud, Azure, Apsara, Ucloud + // required: false + UserData string `json:"user_data"` // swagger: ignore Restart bool `json:"restart"` diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 8499e5c070..f224b536df 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -544,6 +544,10 @@ func (drv *SManagedVirtualizedGuestDriver) RequestDeployGuestOnHost(ctx context. return guest.GetDriver().RemoteDeployGuestForDeploy(ctx, guest, ihost, task, desc) }) case "rebuild": + userData, err := task.GetParams().GetString("user_data") + if err == nil { + desc.UserData = userData + } taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { return guest.GetDriver().RemoteDeployGuestForRebuildRoot(ctx, guest, ihost, task, desc) }) @@ -737,6 +741,7 @@ func (drv *SManagedVirtualizedGuestDriver) RemoteDeployGuestForDeploy(ctx contex Username: desc.Account, PublicKey: desc.PublicKey, Password: desc.Password, + UserData: desc.UserData, } opts.DeleteKeypair = jsonutils.QueryBoolean(params, "__delete_keypair__", false) @@ -805,6 +810,7 @@ func (drv *SManagedVirtualizedGuestDriver) RemoteDeployGuestForRebuildRoot(ctx c PublicKey: desc.PublicKey, SysSizeGB: desc.SysDisk.SizeGB, OsType: desc.OsType, + UserData: desc.UserData, } return iVM.RebuildRoot(ctx, &conf) }() diff --git a/vendor/modules.txt b/vendor/modules.txt index 4dd3095b6b..3c6e8c45be 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1465,7 +1465,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227060638-40a1db02d028 +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231227093150-e2e631e15be3 ## explicit; go 1.18 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/instance.go index e764f3f3d9..0359c589fc 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/instance.go @@ -164,7 +164,7 @@ func (self *SInstance) Refresh() error { return nil } -//PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, SUSPENDING, SUSPENDED, and TERMINATED. +// PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, SUSPENDING, SUSPENDED, and TERMINATED. func (instance *SInstance) GetStatus() string { switch instance.Status { case "PROVISIONING": @@ -416,6 +416,7 @@ func (instance *SInstance) RebuildRoot(ctx context.Context, opts *cloudprovider. deployOpts := &cloudprovider.SInstanceDeployOptions{ Username: opts.Account, Password: opts.Password, + UserData: opts.UserData, PublicKey: opts.PublicKey, } return diskId, instance.DeployVM(ctx, deployOpts) @@ -425,6 +426,12 @@ func (instance *SInstance) DeployVM(ctx context.Context, opts *cloudprovider.SIn conf := cloudinit.SCloudConfig{ SshPwauth: cloudinit.SSH_PASSWORD_AUTH_ON, } + if len(opts.UserData) > 0 { + config, err := cloudinit.ParseUserData(opts.UserData) + if err == nil { + conf.Merge(config) + } + } user := cloudinit.NewUser(opts.Username) if len(opts.Password) > 0 { user.Password(opts.Password) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/eip.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/eip.go index bb4a3b7238..1a1cb03924 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/eip.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/eip.go @@ -330,6 +330,7 @@ func (self *SRegion) GetEips(portId string, addrs []string) ([]SEipAddress, erro if len(portId) > 0 { query.Set("port_id", portId) } + query.Set("ip_version", "4") eips := []SEipAddress{} for { resp, err := self.list(SERVICE_VPC_V3, "eip/publicips", query) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go index 4f9c344a5c..75fcafd4d6 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go @@ -407,7 +407,7 @@ func (self *SInstance) GetIEIP() (cloudprovider.ICloudEIP, error) { ips := make([]string, 0) for _, addresses := range self.Addresses { for _, address := range addresses { - if address.OSEXTIPSType != "fixed" && !strings.HasPrefix(address.Addr, "100.") { + if address.OSEXTIPSType != "fixed" && !strings.HasPrefix(address.Addr, "100.") && address.Version == "4" { ips = append(ips, address.Addr) } }