Extending instance resource to enable using custom VM images
This commit is contained in:
parent
ca1eb1917b
commit
1dbd32c6a7
|
@ -174,7 +174,11 @@ func resourceAzureInstanceCreate(d *schema.ResourceData, meta interface{}) (err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the needed details of the image
|
// Retrieve the needed details of the image
|
||||||
configForImage, osType, err := retrieveImageDetails(mc, d.Get("image").(string))
|
configureForImage, osType, err := retrieveImageDetails(
|
||||||
|
mc,
|
||||||
|
d.Get("image").(string),
|
||||||
|
d.Get("storage").(string),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -221,15 +225,10 @@ func resourceAzureInstanceCreate(d *schema.ResourceData, meta interface{}) (err
|
||||||
}(mc)
|
}(mc)
|
||||||
|
|
||||||
// Create a new role for the instance
|
// Create a new role for the instance
|
||||||
role := vmutils.NewVmConfiguration(name, d.Get("size").(string))
|
role := vmutils.NewVMConfiguration(name, d.Get("size").(string))
|
||||||
|
|
||||||
log.Printf("[DEBUG] Configuring deployment from image...")
|
log.Printf("[DEBUG] Configuring deployment from image...")
|
||||||
err = vmutils.ConfigureDeploymentFromPlatformImage(
|
err = configureForImage(&role)
|
||||||
&role,
|
|
||||||
imageName,
|
|
||||||
imageURL,
|
|
||||||
d.Get("image").(string),
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error configuring the deployment for %s: %s", name, err)
|
return fmt.Errorf("Error configuring the deployment for %s: %s", name, err)
|
||||||
}
|
}
|
||||||
|
@ -334,7 +333,7 @@ func resourceAzureInstanceRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
return fmt.Errorf("Error retrieving Cloud Service of instance %s: %s", d.Id(), err)
|
return fmt.Errorf("Error retrieving Cloud Service of instance %s: %s", d.Id(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.Set("reverse_dns", cs.ReverseDnsFqdn)
|
d.Set("reverse_dns", cs.ReverseDNSFqdn)
|
||||||
d.Set("location", cs.Location)
|
d.Set("location", cs.Location)
|
||||||
|
|
||||||
log.Printf("[DEBUG] Retrieving instance: %s", d.Id())
|
log.Printf("[DEBUG] Retrieving instance: %s", d.Id())
|
||||||
|
@ -348,7 +347,6 @@ func resourceAzureInstanceRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
"Instance %s has an unexpected number of roles: %d", d.Id(), len(dpmt.RoleList))
|
"Instance %s has an unexpected number of roles: %d", d.Id(), len(dpmt.RoleList))
|
||||||
}
|
}
|
||||||
|
|
||||||
d.Set("image", dpmt.RoleList[0].VMImageName)
|
|
||||||
d.Set("size", dpmt.RoleList[0].RoleSize)
|
d.Set("size", dpmt.RoleList[0].RoleSize)
|
||||||
|
|
||||||
if len(dpmt.RoleInstanceList) != 1 {
|
if len(dpmt.RoleInstanceList) != 1 {
|
||||||
|
@ -356,7 +354,7 @@ func resourceAzureInstanceRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
"Instance %s has an unexpected number of role instances: %d",
|
"Instance %s has an unexpected number of role instances: %d",
|
||||||
d.Id(), len(dpmt.RoleInstanceList))
|
d.Id(), len(dpmt.RoleInstanceList))
|
||||||
}
|
}
|
||||||
d.Set("ip_address", dpmt.RoleInstanceList[0].IpAddress)
|
d.Set("ip_address", dpmt.RoleInstanceList[0].IPAddress)
|
||||||
|
|
||||||
if len(dpmt.RoleInstanceList[0].InstanceEndpoints) > 0 {
|
if len(dpmt.RoleInstanceList[0].InstanceEndpoints) > 0 {
|
||||||
d.Set("vip_address", dpmt.RoleInstanceList[0].InstanceEndpoints[0].Vip)
|
d.Set("vip_address", dpmt.RoleInstanceList[0].InstanceEndpoints[0].Vip)
|
||||||
|
@ -522,25 +520,27 @@ func resourceAzureEndpointHash(v interface{}) int {
|
||||||
return hashcode.String(buf.String())
|
return hashcode.String(buf.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func retrieveImageDetails(mc *management.Client, id, storage string) (func() error, string, error) {
|
func retrieveImageDetails(
|
||||||
imageName, imageURL, osType, err := retrieveOSImageDetails(mc, id)
|
mc *management.Client,
|
||||||
|
label string,
|
||||||
|
storage string) (func(*virtualmachine.Role) error, string, error) {
|
||||||
|
configureForImage, osType, err := retrieveOSImageDetails(mc, label, storage)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
return configureForImage, osType, nil
|
||||||
return imageName, imageURL, osType, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
imageName, imageURL, osType, err = retrieveVMImageDetails(mc, id)
|
configureForImage, osType, err = retrieveVMImageDetails(mc, label)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return imageName, imageURL, osType, nil
|
return configureForImage, osType, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", "", "", fmt.Errorf("Could not find image with label or name '%s'", id)
|
return nil, "", fmt.Errorf("Could not find image with label '%s'", label)
|
||||||
}
|
}
|
||||||
|
|
||||||
func retrieveOSImageDetails(
|
func retrieveOSImageDetails(
|
||||||
mc *management.Client,
|
mc *management.Client,
|
||||||
label,
|
label,
|
||||||
storage string) (func() error, string, error) {
|
storage string) (func(*virtualmachine.Role) error, string, error) {
|
||||||
imgs, err := osimage.NewClient(*mc).GetImageList()
|
imgs, err := osimage.NewClient(*mc).GetImageList()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("Error retrieving image details: %s", err)
|
return nil, "", fmt.Errorf("Error retrieving image details: %s", err)
|
||||||
|
@ -556,39 +556,61 @@ func retrieveOSImageDetails(
|
||||||
return nil, "",
|
return nil, "",
|
||||||
fmt.Errorf("When using a platform image, the 'storage' parameter is required")
|
fmt.Errorf("When using a platform image, the 'storage' parameter is required")
|
||||||
}
|
}
|
||||||
imageURL = fmt.Sprintf("http://%s.blob.core.windows.net/vhds/%s.vhd", storage, id)
|
img.MediaLink = fmt.Sprintf("http://%s.blob.core.windows.net/vhds/%s.vhd", storage, label)
|
||||||
}
|
}
|
||||||
return img.Name, img.MediaLink, img.OS, nil
|
|
||||||
|
configureForImage := func(role *virtualmachine.Role) error {
|
||||||
|
return vmutils.ConfigureDeploymentFromPlatformImage(
|
||||||
|
role,
|
||||||
|
img.Name,
|
||||||
|
img.MediaLink,
|
||||||
|
label,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return configureForImage, img.OS, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", "", "", fmt.Errorf("Could not find image with label '%s'", label)
|
return nil, "", fmt.Errorf("Could not find image with label '%s'", label)
|
||||||
}
|
}
|
||||||
|
|
||||||
func retrieveVMImageDetails(mc *management.Client, name string) (string, string, string, error) {
|
func retrieveVMImageDetails(
|
||||||
|
mc *management.Client,
|
||||||
|
label string) (func(*virtualmachine.Role) error, string, error) {
|
||||||
imgs, err := virtualmachineimage.NewClient(*mc).GetImageList()
|
imgs, err := virtualmachineimage.NewClient(*mc).GetImageList()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", "", fmt.Errorf("Error retrieving image details: %s", err)
|
return nil, "", fmt.Errorf("Error retrieving image details: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, img := range imgs {
|
for _, img := range imgs {
|
||||||
if img.Name == name {
|
if img.Label == label {
|
||||||
if img.OSDiskConfiguration.OS != linux && img.OSDiskConfiguration.OS != windows {
|
if img.OSDiskConfiguration.OS != linux && img.OSDiskConfiguration.OS != windows {
|
||||||
return "", "", "", fmt.Errorf("Unsupported image OS: %s", img.OSDiskConfiguration.OS)
|
return nil, "", fmt.Errorf("Unsupported image OS: %s", img.OSDiskConfiguration.OS)
|
||||||
}
|
}
|
||||||
return img.Name, img.OSDiskConfiguration.MediaLink, img.OSDiskConfiguration.OS, nil
|
|
||||||
|
configureForImage := func(role *virtualmachine.Role) error {
|
||||||
|
return vmutils.ConfigureDeploymentFromVMImage(
|
||||||
|
role,
|
||||||
|
img.Name,
|
||||||
|
"",
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return configureForImage, img.OSDiskConfiguration.OS, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", "", "", fmt.Errorf("Could not find image with name '%s'", name)
|
return nil, "", fmt.Errorf("Could not find image with label '%s'", label)
|
||||||
}
|
}
|
||||||
|
|
||||||
func endpointProtocol(p string) virtualmachine.InputEndpointProtocol {
|
func endpointProtocol(p string) virtualmachine.InputEndpointProtocol {
|
||||||
if p == "tcp" {
|
if p == "tcp" {
|
||||||
return virtualmachine.InputEndpointProtocolTcp
|
return virtualmachine.InputEndpointProtocolTCP
|
||||||
}
|
}
|
||||||
|
|
||||||
return virtualmachine.InputEndpointProtocolUdp
|
return virtualmachine.InputEndpointProtocolUDP
|
||||||
}
|
}
|
||||||
|
|
||||||
func verifyParameters(d *schema.ResourceData, osType string) error {
|
func verifyParameters(d *schema.ResourceData, osType string) error {
|
||||||
|
|
Loading…
Reference in New Issue