github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/environs/manual/winrmprovisioner/provisioner.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Copyright 2016 Cloudbase Solutions SRL 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package winrmprovisioner 6 7 import ( 8 "github.com/juju/errors" 9 "github.com/juju/loggo" 10 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/environs/manual" 13 ) 14 15 var logger = loggo.GetLogger("juju.environs.manual.winrmprovisioner") 16 17 // ProvisionMachine returns a new machineId and nil if the provision process is done successfully 18 // The function will manual provision a windows machine using as comunication protocol WinRM(windows remote manager) 19 func ProvisionMachine(args manual.ProvisionMachineArgs) (machineId string, err error) { 20 defer func() { 21 if machineId != "" && err != nil { 22 logger.Errorf("provisioning failed, removing machine %v: %v", machineId, err) 23 if cleanupErr := args.Client.ForceDestroyMachines(machineId); cleanupErr != nil { 24 logger.Errorf("error cleaning up machine: %s", cleanupErr) 25 } 26 machineId = "" 27 } 28 }() 29 30 if err = InitAdministratorUser(&args); err != nil { 31 return "", errors.Annotatef(err, 32 "Cannot provision machine because no WinRM http/https standard listener is enabled for user %q, on host %q", 33 args.User, args.Host) 34 } 35 36 machineParams, err := gatherMachineParams(args.Host, args.WinRM.Client) 37 if err != nil { 38 return "", err 39 } 40 41 machineId, err = manual.RecordMachineInState(args.Client, *machineParams) 42 if err != nil { 43 return "", err 44 } 45 46 provisioningScript, err := args.Client.ProvisioningScript(params.ProvisioningScriptParams{ 47 MachineId: machineId, 48 Nonce: machineParams.Nonce, 49 DisablePackageCommands: true, 50 }) 51 52 if err != nil { 53 return "", err 54 } 55 56 // Finally, provision the machine agent. 57 err = runProvisionScript(provisioningScript, args.WinRM.Client, args.Stdout, args.Stderr) 58 if err != nil { 59 return "", err 60 } 61 62 logger.Infof("Provisioned machine %v", machineId) 63 return machineId, nil 64 }