Skip to content

Commit

Permalink
fix: 优化windows powershell userdata
Browse files Browse the repository at this point in the history
  • Loading branch information
Qu Xuan committed May 14, 2020
1 parent 600226f commit 5c6b016
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 13 deletions.
2 changes: 2 additions & 0 deletions pkg/cloudprovider/instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 8 additions & 0 deletions pkg/compute/guestdrivers/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -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" {
Expand Down
8 changes: 8 additions & 0 deletions pkg/compute/guestdrivers/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
11 changes: 10 additions & 1 deletion pkg/compute/guestdrivers/managedvirtual.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package guestdrivers

import (
"context"
"encoding/base64"
"fmt"
"math"
"strings"
Expand Down Expand Up @@ -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))
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions pkg/compute/models/guestdrivers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 0 additions & 9 deletions pkg/multicloud/aws/host.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down
16 changes: 13 additions & 3 deletions pkg/util/cloudinit/cloudconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 5c6b016

Please sign in to comment.