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  }