Merge pull request #6346 from ioito/hotfix/qx-cloud-init

fix: 优化windows powershell userdata
This commit is contained in:
Zexi Li
2020-05-15 11:09:40 +08:00
committed by GitHub
7 changed files with 43 additions and 13 deletions
+2
View File
@@ -37,6 +37,8 @@ const (
CLOUD_SHELL = "cloud-shell"
CLOUD_SHELL_WITHOUT_ENCRYPT = "cloud-shell-without-encrypt"
CLOUD_CONFIG = "cloud-config"
CLOUD_POWER_SHELL = "powershell"
CLOUD_EC2 = "ec2"
)
type SManagedVMCreateConfig struct {
+8
View File
@@ -78,6 +78,14 @@ func (self *SAwsGuestDriver) IsNeedInjectPasswordByCloudInit(desc *cloudprovider
return true
}
func (self *SAwsGuestDriver) IsWindowsUserDataTypeNeedEncode() bool {
return true
}
func (self *SAwsGuestDriver) GetWindowsUserDataType() string {
return cloudprovider.CLOUD_EC2
}
func (self *SAwsGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string {
// return fetchAwsUserName(desc)
if desc.OsType == "Windows" {
+8
View File
@@ -298,6 +298,14 @@ func (self *SBaseGuestDriver) IsNeedInjectPasswordByCloudInit(desc *cloudprovide
return false
}
func (self *SBaseGuestDriver) GetWindowsUserDataType() string {
return cloudprovider.CLOUD_POWER_SHELL
}
func (self *SBaseGuestDriver) IsWindowsUserDataTypeNeedEncode() bool {
return false
}
func (self *SBaseGuestDriver) GetUserDataType() string {
return cloudprovider.CLOUD_CONFIG
}
+10 -1
View File
@@ -16,6 +16,7 @@ package guestdrivers
import (
"context"
"encoding/base64"
"fmt"
"math"
"strings"
@@ -347,7 +348,15 @@ func (self *SManagedVirtualizedGuestDriver) RequestDeployGuestOnHost(ctx context
desc.UserData = oUserData.UserDataBase64()
}
if strings.ToLower(desc.OsType) == strings.ToLower(osprofile.OS_TYPE_WINDOWS) {
desc.UserData = oUserData.UserDataPowerShell()
switch guest.GetDriver().GetWindowsUserDataType() {
case cloudprovider.CLOUD_EC2:
desc.UserData = oUserData.UserDataEc2()
default:
desc.UserData = oUserData.UserDataPowerShell()
}
if guest.GetDriver().IsWindowsUserDataTypeNeedEncode() {
desc.UserData = base64.StdEncoding.EncodeToString([]byte(desc.UserData))
}
}
}
+2
View File
@@ -178,6 +178,8 @@ type IGuestDriver interface {
IsNeedInjectPasswordByCloudInit(desc *cloudprovider.SManagedVMCreateConfig) bool
GetUserDataType() string
GetWindowsUserDataType() string
IsWindowsUserDataTypeNeedEncode() bool
CancelExpireTime(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest) error
IsSupportCdrom(guest *SGuest) (bool, error)
-9
View File
@@ -15,13 +15,10 @@
package aws
import (
"encoding/base64"
"fmt"
"strings"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/util/osprofile"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudprovider"
@@ -176,12 +173,6 @@ func (self *SHost) GetInstanceById(instanceId string) (*SInstance, error) {
}
func (self *SHost) CreateVM(desc *cloudprovider.SManagedVMCreateConfig) (cloudprovider.ICloudVM, error) {
if strings.ToLower(desc.OsType) == strings.ToLower(osprofile.OS_TYPE_WINDOWS) {
// powershell scripts
data := fmt.Sprintf("<powershell>%s</powershell>", desc.UserData)
desc.UserData = base64.StdEncoding.EncodeToString([]byte(data))
}
vmId, err := self._createVM(desc.Name, desc.ExternalImageId, desc.SysDisk, desc.InstanceType, desc.ExternalNetworkId, desc.IpAddr, desc.Description, desc.Password, desc.DataDisks, desc.PublicKey, desc.ExternalSecgroupId, desc.UserData)
if err != nil {
return nil, err
+13 -3
View File
@@ -37,8 +37,9 @@ type TSudoPolicy string
type TSshPwauth string
const (
CLOUD_CONFIG_HEADER = "#cloud-config\n"
CLOUD_SHELL_HEADER = "#!/usr/bin/env bash\n"
CLOUD_CONFIG_HEADER = "#cloud-config\n"
CLOUD_SHELL_HEADER = "#!/usr/bin/env bash\n"
CLOUD_POWER_SHELL_HEADER = "#ps1\n"
USER_SUDO_NOPASSWD = TSudoPolicy("sudo_nopasswd")
USER_SUDO = TSudoPolicy("sudo")
@@ -255,7 +256,16 @@ func (conf *SCloudConfig) UserDataPowerShell() string {
}
shells = append(shells, conf.Runcmd...)
return strings.Join(shells, "\n")
return CLOUD_POWER_SHELL_HEADER + strings.Join(shells, "\n")
}
func (conf *SCloudConfig) UserDataEc2() string {
shells := []string{}
for _, u := range conf.Users {
shells = append(shells, u.PowerShellScripts()...)
}
shells = append(shells, conf.Runcmd...)
return "<powershell>\n" + strings.Join(shells, "\n") + "\n</powershell>"
}
func (conf *SCloudConfig) UserDataBase64() string {