[builder/azure-chroot] Shared image source (#9070)
This commit is contained in:
parent
ab119d3270
commit
26d768f429
|
@ -24,10 +24,10 @@ import (
|
|||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
"github.com/hashicorp/packer/template/interpolate"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
)
|
||||
|
||||
// BuilderID is the unique ID for this builder
|
||||
|
@ -42,7 +42,10 @@ type Config struct {
|
|||
|
||||
// When set to `true`, starts with an empty, unpartitioned disk. Defaults to `false`.
|
||||
FromScratch bool `mapstructure:"from_scratch"`
|
||||
// Either a managed disk resource ID or a publisher:offer:sku:version specifier for plaform image sources.
|
||||
// One of the following can be used as a source for an image:
|
||||
// - a shared image version resource ID
|
||||
// - a managed disk resource ID
|
||||
// - a publisher:offer:sku:version specifier for plaform image sources.
|
||||
Source string `mapstructure:"source" required:"true"`
|
||||
sourceType sourceType
|
||||
|
||||
|
@ -112,6 +115,7 @@ type sourceType string
|
|||
const (
|
||||
sourcePlatformImage sourceType = "PlatformImage"
|
||||
sourceDisk sourceType = "Disk"
|
||||
sourceSharedImage sourceType = "SharedImage"
|
||||
)
|
||||
|
||||
// GetContext implements ContextProvider to allow steps to use the config context
|
||||
|
@ -246,10 +250,16 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) {
|
|||
if _, err := client.ParsePlatformImageURN(b.config.Source); err == nil {
|
||||
log.Println("Source is platform image:", b.config.Source)
|
||||
b.config.sourceType = sourcePlatformImage
|
||||
} else if id, err := azure.ParseResourceID(b.config.Source); err == nil &&
|
||||
strings.EqualFold(id.Provider, "Microsoft.Compute") && strings.EqualFold(id.ResourceType, "disks") {
|
||||
} else if id, err := client.ParseResourceID(b.config.Source); err == nil &&
|
||||
strings.EqualFold(id.Provider, "Microsoft.Compute") &&
|
||||
strings.EqualFold(id.ResourceType.String(), "disks") {
|
||||
log.Println("Source is a disk resource ID:", b.config.Source)
|
||||
b.config.sourceType = sourceDisk
|
||||
} else if id, err := client.ParseResourceID(b.config.Source); err == nil &&
|
||||
strings.EqualFold(id.Provider, "Microsoft.Compute") &&
|
||||
strings.EqualFold(id.ResourceType.String(), "galleries/images/versions") {
|
||||
log.Println("Source is a shared image ID:", b.config.Source)
|
||||
b.config.sourceType = sourceSharedImage
|
||||
} else {
|
||||
errs = packer.MultiErrorAppend(
|
||||
errs, fmt.Errorf("source: %q is not a valid platform image specifier, nor is it a disk resource ID", b.config.Source))
|
||||
|
@ -410,7 +420,7 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack
|
|||
func buildsteps(config Config, info *client.ComputeInfo) []multistep.Step {
|
||||
// Build the steps
|
||||
var steps []multistep.Step
|
||||
addSteps := func(s ...multistep.Step) { // convenience
|
||||
addSteps := func(s ...multistep.Step) { // convenience function
|
||||
steps = append(steps, s...)
|
||||
}
|
||||
|
||||
|
@ -477,6 +487,22 @@ func buildsteps(config Config, info *client.ComputeInfo) []multistep.Step {
|
|||
SkipCleanup: config.SkipCleanup,
|
||||
})
|
||||
|
||||
case sourceSharedImage:
|
||||
addSteps(
|
||||
&StepVerifySharedImageSource{
|
||||
SharedImageID: config.Source,
|
||||
SubscriptionID: info.SubscriptionID,
|
||||
Location: info.Location,
|
||||
},
|
||||
&StepCreateNewDisk{
|
||||
ResourceID: config.TemporaryOSDiskID,
|
||||
DiskSizeGB: config.OSDiskSizeGB,
|
||||
SourceImageResourceID: config.Source,
|
||||
Location: info.Location,
|
||||
|
||||
SkipCleanup: config.SkipCleanup,
|
||||
})
|
||||
|
||||
default:
|
||||
panic(fmt.Errorf("Unknown source type: %+q", config.sourceType))
|
||||
}
|
||||
|
|
|
@ -4,9 +4,10 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
)
|
||||
|
||||
func TestBuilder_Prepare(t *testing.T) {
|
||||
|
@ -27,6 +28,12 @@ func TestBuilder_Prepare(t *testing.T) {
|
|||
"subscription_id": "789",
|
||||
"source": "credativ:Debian:9:latest",
|
||||
"image_resource_id": "/subscriptions/789/resourceGroups/otherrgname/providers/Microsoft.Compute/images/MyDebianOSImage-{{timestamp}}",
|
||||
"shared_image_destination": config{
|
||||
"resource_group": "otherrgname",
|
||||
"gallery_name": "myGallery",
|
||||
"image_name": "imageName",
|
||||
"image_version": "1.0.2",
|
||||
},
|
||||
},
|
||||
validate: func(c Config) {
|
||||
if c.OSDiskSizeGB != 0 {
|
||||
|
@ -85,6 +92,19 @@ func TestBuilder_Prepare(t *testing.T) {
|
|||
},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "from shared image",
|
||||
config: config{
|
||||
"shared_image_destination": config{
|
||||
"resource_group": "otherrgname",
|
||||
"gallery_name": "myGallery",
|
||||
"image_name": "imageName",
|
||||
"image_version": "1.0.2",
|
||||
},
|
||||
"source": "/subscriptions/789/resourceGroups/testrg/providers/Microsoft.Compute/disks/diskname",
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "err: no output",
|
||||
config: config{
|
||||
|
|
|
@ -13,7 +13,7 @@ import (
|
|||
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
)
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
|
|
|
@ -5,7 +5,7 @@ import (
|
|||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
|
@ -30,6 +30,8 @@ type StepCreateNewDisk struct {
|
|||
|
||||
SourceDiskResourceID string
|
||||
|
||||
SourceImageResourceID string
|
||||
|
||||
SkipCleanup bool
|
||||
}
|
||||
|
||||
|
@ -67,34 +69,44 @@ func (s *StepCreateNewDisk) Run(ctx context.Context, state multistep.StateBag) m
|
|||
|
||||
disk := compute.Disk{
|
||||
Location: to.StringPtr(s.Location),
|
||||
Sku: &compute.DiskSku{
|
||||
Name: compute.DiskStorageAccountTypes(s.DiskStorageAccountType),
|
||||
},
|
||||
//Zones: nil,
|
||||
DiskProperties: &compute.DiskProperties{
|
||||
OsType: "Linux",
|
||||
HyperVGeneration: compute.HyperVGeneration(s.HyperVGeneration),
|
||||
CreationData: &compute.CreationData{},
|
||||
OsType: "Linux",
|
||||
CreationData: &compute.CreationData{},
|
||||
},
|
||||
//Tags: map[string]*string{
|
||||
}
|
||||
|
||||
if s.DiskStorageAccountType != "" {
|
||||
disk.Sku = &compute.DiskSku{
|
||||
Name: compute.DiskStorageAccountTypes(s.DiskStorageAccountType),
|
||||
}
|
||||
}
|
||||
|
||||
if s.HyperVGeneration != "" {
|
||||
disk.DiskProperties.HyperVGeneration = compute.HyperVGeneration(s.HyperVGeneration)
|
||||
}
|
||||
|
||||
if s.DiskSizeGB > 0 {
|
||||
disk.DiskProperties.DiskSizeGB = to.Int32Ptr(s.DiskSizeGB)
|
||||
}
|
||||
|
||||
if s.SourceDiskResourceID != "" {
|
||||
disk.CreationData.CreateOption = compute.Copy
|
||||
disk.CreationData.SourceResourceID = to.StringPtr(s.SourceDiskResourceID)
|
||||
} else if s.PlatformImage == nil {
|
||||
disk.CreationData.CreateOption = compute.Empty
|
||||
} else {
|
||||
switch {
|
||||
case s.PlatformImage != nil:
|
||||
disk.CreationData.CreateOption = compute.FromImage
|
||||
disk.CreationData.ImageReference = &compute.ImageDiskReference{
|
||||
ID: to.StringPtr(fmt.Sprintf(
|
||||
"/subscriptions/%s/providers/Microsoft.Compute/locations/%s/publishers/%s/artifacttypes/vmimage/offers/%s/skus/%s/versions/%s",
|
||||
s.subscriptionID, s.Location, s.PlatformImage.Publisher, s.PlatformImage.Offer, s.PlatformImage.Sku, s.PlatformImage.Version)),
|
||||
}
|
||||
case s.SourceDiskResourceID != "":
|
||||
disk.CreationData.CreateOption = compute.Copy
|
||||
disk.CreationData.SourceResourceID = to.StringPtr(s.SourceDiskResourceID)
|
||||
case s.SourceImageResourceID != "":
|
||||
disk.CreationData.CreateOption = compute.FromImage
|
||||
disk.CreationData.GalleryImageReference = &compute.ImageDiskReference{
|
||||
ID: to.StringPtr(s.SourceImageResourceID),
|
||||
}
|
||||
default:
|
||||
disk.CreationData.CreateOption = compute.Empty
|
||||
}
|
||||
|
||||
f, err := azcli.DisksClient().CreateOrUpdate(ctx, s.resourceGroup, s.diskName, disk)
|
||||
|
|
|
@ -12,7 +12,7 @@ import (
|
|||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
|
|
|
@ -4,8 +4,9 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
|
@ -63,7 +64,11 @@ func (s *StepCreateSharedImageVersion) Run(ctx context.Context, state multistep.
|
|||
imageVersion)
|
||||
if err == nil {
|
||||
log.Println("Shared image version creation in process...")
|
||||
err = f.WaitForCompletionRef(ctx, azcli.PollClient())
|
||||
pollClient := azcli.PollClient()
|
||||
pollClient.PollingDelay = 10 * time.Second
|
||||
ctx, cancel := context.WithTimeout(ctx, time.Hour*12)
|
||||
defer cancel()
|
||||
err = f.WaitForCompletionRef(ctx, pollClient)
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("StepCreateSharedImageVersion.Run: error: %+v", err)
|
||||
|
|
|
@ -12,7 +12,7 @@ import (
|
|||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ import (
|
|||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
)
|
||||
|
@ -73,9 +73,11 @@ func (s *StepCreateSnapshot) Run(ctx context.Context, state multistep.StateBag)
|
|||
|
||||
f, err := azcli.SnapshotsClient().CreateOrUpdate(ctx, s.resourceGroup, s.snapshotName, snapshot)
|
||||
if err == nil {
|
||||
cli := azcli.PollClient() // quick polling for quick operations
|
||||
cli.PollingDelay = time.Second
|
||||
err = f.WaitForCompletionRef(ctx, cli)
|
||||
pollClient := azcli.PollClient()
|
||||
pollClient.PollingDelay = 2 * time.Second
|
||||
ctx, cancel := context.WithTimeout(ctx, time.Hour*12)
|
||||
defer cancel()
|
||||
err = f.WaitForCompletionRef(ctx, pollClient)
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("StepCreateSnapshot.Run: error: %+v", err)
|
||||
|
|
|
@ -9,11 +9,12 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
func Test_parseSnapshotResourceID(t *testing.T) {
|
||||
|
@ -176,13 +177,13 @@ func TestStepCreateSnapshot_Cleanup(t *testing.T) {
|
|||
m := compute.NewSnapshotsClient("subscriptionId")
|
||||
{
|
||||
expectedCalls := []string{
|
||||
"POST /subscriptions/subscriptionId/resourceGroups/rg/providers/Microsoft.Compute/snapshots/snap1/endGetAccess?api-version=2019-07-01",
|
||||
"DELETE /subscriptions/subscriptionId/resourceGroups/rg/providers/Microsoft.Compute/snapshots/snap1?api-version=2019-07-01",
|
||||
"POST /subscriptions/subscriptionId/resourceGroups/rg/providers/Microsoft.Compute/snapshots/snap1/endGetAccess",
|
||||
"DELETE /subscriptions/subscriptionId/resourceGroups/rg/providers/Microsoft.Compute/snapshots/snap1",
|
||||
}
|
||||
i := 0
|
||||
m.Sender = autorest.SenderFunc(func(r *http.Request) (*http.Response, error) {
|
||||
want := expectedCalls[i]
|
||||
got := r.Method + " " + r.URL.RequestURI()
|
||||
got := r.Method + " " + r.URL.Path
|
||||
if want != got {
|
||||
t.Errorf("unexpected HTTP call: %v, wanted %v", got, want)
|
||||
return &http.Response{
|
||||
|
|
|
@ -8,10 +8,11 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
func TestStepResolvePlatformImageVersion_Run(t *testing.T) {
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
|
|
|
@ -8,11 +8,12 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
func TestStepVerifySharedImageDestination_Run(t *testing.T) {
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
package chroot
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
)
|
||||
|
||||
var _ multistep.Step = &StepVerifySharedImageSource{}
|
||||
|
||||
// StepVerifySharedImageSource verifies that the shared image location matches the Location field in the step.
|
||||
// Also verifies that the OS Type is Linux.
|
||||
type StepVerifySharedImageSource struct {
|
||||
SharedImageID string
|
||||
SubscriptionID string
|
||||
Location string
|
||||
}
|
||||
|
||||
// Run retrieves the image metadata from Azure and compares the location to Location. Verifies the OS Type.
|
||||
func (s *StepVerifySharedImageSource) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
|
||||
azcli := state.Get("azureclient").(client.AzureClientSet)
|
||||
ui := state.Get("ui").(packer.Ui)
|
||||
|
||||
errorMessage := func(message string, parameters ...interface{}) multistep.StepAction {
|
||||
err := fmt.Errorf(message, parameters...)
|
||||
log.Printf("StepVerifySharedImageSource.Run: error: %+v", err)
|
||||
state.Put("error", err)
|
||||
ui.Error(err.Error())
|
||||
return multistep.ActionHalt
|
||||
}
|
||||
|
||||
resource, err := client.ParseResourceID(s.SharedImageID)
|
||||
if err != nil {
|
||||
return errorMessage("Could not parse resource id %q: %w", s.SharedImageID, err)
|
||||
}
|
||||
|
||||
if !strings.EqualFold(resource.Provider, "Microsoft.Compute") ||
|
||||
!strings.EqualFold(resource.ResourceType.String(), "galleries/images/versions") {
|
||||
return errorMessage("Resource id %q does not identify a shared image version, expected Microsoft.Compute/galleries/images/versions", s.SharedImageID)
|
||||
}
|
||||
|
||||
ui.Say(fmt.Sprintf("Validating that shared image version %q exists",
|
||||
s.SharedImageID))
|
||||
|
||||
version, err := azcli.GalleryImageVersionsClient().Get(ctx,
|
||||
resource.ResourceGroup,
|
||||
resource.ResourceName[0],
|
||||
resource.ResourceName[1],
|
||||
resource.ResourceName[2],
|
||||
"")
|
||||
|
||||
if err != nil {
|
||||
return errorMessage("Error retrieving shared image version %q: %+v ", s.SharedImageID, err)
|
||||
}
|
||||
|
||||
if version.ID == nil || *version.ID == "" {
|
||||
return errorMessage("Error retrieving shared image version %q: ID field in response is empty", s.SharedImageID)
|
||||
}
|
||||
|
||||
if version.GalleryImageVersionProperties == nil ||
|
||||
version.GalleryImageVersionProperties.PublishingProfile == nil ||
|
||||
version.GalleryImageVersionProperties.PublishingProfile.TargetRegions == nil {
|
||||
return errorMessage("Could not retrieve shared image version properties for image %q.", s.SharedImageID)
|
||||
}
|
||||
|
||||
targetLocations := make([]string, 0, len(*version.GalleryImageVersionProperties.PublishingProfile.TargetRegions))
|
||||
vmLocation := client.NormalizeLocation(s.Location)
|
||||
locationFound := false
|
||||
for _, tr := range *version.GalleryImageVersionProperties.PublishingProfile.TargetRegions {
|
||||
l := to.String(tr.Name)
|
||||
l = client.NormalizeLocation(l)
|
||||
targetLocations = append(targetLocations, l)
|
||||
if strings.EqualFold(vmLocation, l) {
|
||||
locationFound = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !locationFound {
|
||||
return errorMessage("Target locations %q for %q does not include VM location %q",
|
||||
targetLocations, s.SharedImageID, vmLocation)
|
||||
}
|
||||
|
||||
imageResource, _ := resource.Parent()
|
||||
image, err := azcli.GalleryImagesClient().Get(ctx,
|
||||
resource.ResourceGroup,
|
||||
resource.ResourceName[0],
|
||||
resource.ResourceName[1])
|
||||
|
||||
if err != nil {
|
||||
return errorMessage("Error retrieving shared image %q: %+v ", imageResource.String(), err)
|
||||
}
|
||||
|
||||
if image.ID == nil || *image.ID == "" {
|
||||
return errorMessage("Error retrieving shared image %q: ID field in response is empty", imageResource.String())
|
||||
}
|
||||
|
||||
if image.GalleryImageProperties == nil {
|
||||
return errorMessage("Could not retrieve shared image properties for image %q.", imageResource.String())
|
||||
}
|
||||
|
||||
log.Printf("StepVerifySharedImageSource:Run: Image %q, HvGen: %q, osState: %q",
|
||||
to.String(image.ID),
|
||||
image.GalleryImageProperties.HyperVGeneration,
|
||||
image.GalleryImageProperties.OsState)
|
||||
|
||||
if image.GalleryImageProperties.OsType != compute.Linux {
|
||||
return errorMessage("The shared image (%q) is not a Linux image (found %q). Currently only Linux images are supported.",
|
||||
to.String(image.ID),
|
||||
image.GalleryImageProperties.OsType)
|
||||
}
|
||||
|
||||
ui.Say(fmt.Sprintf("Found image source image version %q, available in location %s",
|
||||
s.SharedImageID,
|
||||
s.Location))
|
||||
|
||||
return multistep.ActionContinue
|
||||
}
|
||||
|
||||
func (*StepVerifySharedImageSource) Cleanup(multistep.StateBag) {}
|
|
@ -0,0 +1,188 @@
|
|||
package chroot
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
)
|
||||
|
||||
func TestStepVerifySharedImageSource_Run(t *testing.T) {
|
||||
type fields struct {
|
||||
SharedImageID string
|
||||
SubscriptionID string
|
||||
Location string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
want multistep.StepAction
|
||||
wantErr string
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
fields: fields{
|
||||
SharedImageID: "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/galleries/myGallery/images/myImage/versions/1.2.3",
|
||||
Location: "VM location",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "resource is not a shared image",
|
||||
fields: fields{
|
||||
SharedImageID: "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/disks/myDisk",
|
||||
Location: "VM location",
|
||||
},
|
||||
want: multistep.ActionHalt,
|
||||
wantErr: "does not identify a shared image version",
|
||||
},
|
||||
{
|
||||
name: "error in resource id",
|
||||
fields: fields{
|
||||
SharedImageID: "not-a-resource-id",
|
||||
},
|
||||
want: multistep.ActionHalt,
|
||||
wantErr: "Could not parse resource id",
|
||||
},
|
||||
{
|
||||
name: "wrong location",
|
||||
fields: fields{
|
||||
SharedImageID: "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/galleries/myGallery/images/myImage/versions/1.2.3",
|
||||
Location: "other location",
|
||||
},
|
||||
want: multistep.ActionHalt,
|
||||
wantErr: "does not include VM location",
|
||||
},
|
||||
{
|
||||
name: "image not found",
|
||||
fields: fields{
|
||||
SharedImageID: "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/galleries/myGallery/images/myImage/versions/2.3.4",
|
||||
Location: "vm location",
|
||||
},
|
||||
want: multistep.ActionHalt,
|
||||
wantErr: "Error retrieving shared image version",
|
||||
},
|
||||
{
|
||||
name: "windows image",
|
||||
fields: fields{
|
||||
SharedImageID: "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/galleries/myGallery/images/windowsImage/versions/1.2.3",
|
||||
Location: "VM location",
|
||||
},
|
||||
want: multistep.ActionHalt,
|
||||
wantErr: "not a Linux image",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
giv := compute.NewGalleryImageVersionsClient("subscriptionID")
|
||||
giv.Sender = autorest.SenderFunc(func(r *http.Request) (*http.Response, error) {
|
||||
if r.Method == "GET" {
|
||||
switch {
|
||||
case strings.HasSuffix(r.URL.Path, "/versions/1.2.3"):
|
||||
return &http.Response{
|
||||
Request: r,
|
||||
Body: ioutil.NopCloser(strings.NewReader(`{
|
||||
"id": "image-version-id",
|
||||
"properties": {
|
||||
"publishingProfile": {
|
||||
"targetRegions": [
|
||||
{ "name": "vm Location" }
|
||||
]
|
||||
}
|
||||
}
|
||||
}`)),
|
||||
StatusCode: 200,
|
||||
}, nil
|
||||
case regexp.MustCompile(`(?i)^/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/galleries/myGallery/images/myImage/versions/\d+\.\d+\.\d+$`).
|
||||
MatchString(r.URL.Path):
|
||||
return &http.Response{
|
||||
Request: r,
|
||||
Body: ioutil.NopCloser(strings.NewReader(`{"error":{"code":"NotFound"}}`)),
|
||||
StatusCode: 404,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
t.Errorf("Unexpected HTTP call: %s %s", r.Method, r.URL.RequestURI())
|
||||
return &http.Response{
|
||||
Request: r,
|
||||
Status: "Unexpected HTTP call",
|
||||
Body: ioutil.NopCloser(strings.NewReader(`{"code":"TestError"}`)),
|
||||
StatusCode: 599,
|
||||
}, nil
|
||||
})
|
||||
|
||||
gi := compute.NewGalleryImagesClient("subscriptionID")
|
||||
gi.Sender = autorest.SenderFunc(func(r *http.Request) (*http.Response, error) {
|
||||
if r.Method == "GET" {
|
||||
switch {
|
||||
case strings.HasSuffix(r.URL.Path, "/images/myImage"):
|
||||
return &http.Response{
|
||||
Request: r,
|
||||
Body: ioutil.NopCloser(strings.NewReader(`{
|
||||
"id": "image-id",
|
||||
"properties": {
|
||||
"osType": "Linux"
|
||||
}
|
||||
}`)),
|
||||
StatusCode: 200,
|
||||
}, nil
|
||||
case strings.HasSuffix(r.URL.Path, "/images/windowsImage"):
|
||||
return &http.Response{
|
||||
Request: r,
|
||||
Body: ioutil.NopCloser(strings.NewReader(`{
|
||||
"id": "image-id",
|
||||
"properties": {
|
||||
"osType": "Windows"
|
||||
}
|
||||
}`)),
|
||||
StatusCode: 200,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
t.Errorf("Unexpected HTTP call: %s %s", r.Method, r.URL.RequestURI())
|
||||
return &http.Response{
|
||||
Request: r,
|
||||
Status: "Unexpected HTTP call",
|
||||
Body: ioutil.NopCloser(strings.NewReader(`{"error":{"code":"TestError"}}`)),
|
||||
StatusCode: 599,
|
||||
}, nil
|
||||
})
|
||||
|
||||
state := new(multistep.BasicStateBag)
|
||||
state.Put("azureclient", &client.AzureClientSetMock{
|
||||
SubscriptionIDMock: "subscriptionID",
|
||||
GalleryImageVersionsClientMock: giv,
|
||||
GalleryImagesClientMock: gi,
|
||||
})
|
||||
state.Put("ui", packer.TestUi(t))
|
||||
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
s := &StepVerifySharedImageSource{
|
||||
SharedImageID: tt.fields.SharedImageID,
|
||||
SubscriptionID: tt.fields.SubscriptionID,
|
||||
Location: tt.fields.Location,
|
||||
}
|
||||
if got := s.Run(context.TODO(), state); !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("StepVerifySharedImageSource.Run() = %v, want %v", got, tt.want)
|
||||
}
|
||||
d, _ := state.GetOk("error")
|
||||
err, _ := d.(error)
|
||||
if tt.wantErr != "" {
|
||||
if !strings.Contains(err.Error(), tt.wantErr) {
|
||||
t.Errorf("Wanted error %q, got %q", tt.wantErr, err)
|
||||
}
|
||||
} else if err != nil && err.Error() != "" {
|
||||
t.Errorf("Unexpected error: %v", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
|
@ -9,7 +9,7 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/hashicorp/packer/builder/azure/common/client"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
|
|
|
@ -7,8 +7,8 @@ import (
|
|||
|
||||
"github.com/hashicorp/packer/helper/useragent"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute/computeapi"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute/computeapi"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package client
|
||||
|
||||
import (
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute/computeapi"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute/computeapi"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package client
|
||||
|
||||
import "strings"
|
||||
|
||||
// NormalizeLocation returns a normalized location string.
|
||||
// Strings are converted to lower case and spaces are removed.
|
||||
func NormalizeLocation(loc string) string {
|
||||
return strings.ReplaceAll(strings.ToLower(loc), " ", "")
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package client
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestNormalizeLocation(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
loc string
|
||||
want string
|
||||
}{
|
||||
{"removes spaces", " with spaces ", "withspaces"},
|
||||
{"makes lowercase", "MiXed Case", "mixedcase"},
|
||||
{"North East US", "North East US", "northeastus"},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := NormalizeLocation(tt.loc); got != tt.want {
|
||||
t.Errorf("NormalizeLocation() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
|
@ -6,8 +6,8 @@ import (
|
|||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute/computeapi"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute/computeapi"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
)
|
||||
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
package client
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ParseResourceID parses an Azure resource ID
|
||||
func ParseResourceID(resourceID string) (Resource, error) {
|
||||
resourceID = strings.Trim(resourceID, "/")
|
||||
segments := strings.Split(resourceID, "/")
|
||||
if len(segments)%2 != 0 {
|
||||
return Resource{}, errors.New("Expected even number of segments")
|
||||
}
|
||||
|
||||
npairs := len(segments) / 2
|
||||
|
||||
keys := make([]string, npairs)
|
||||
values := make([]string, npairs)
|
||||
for i := 0; i < len(segments); i += 2 {
|
||||
keys[i/2] = segments[i]
|
||||
values[i/2] = segments[i+1]
|
||||
|
||||
if keys[i/2] == "" {
|
||||
return Resource{}, fmt.Errorf("Found empty segment (%d)", i)
|
||||
}
|
||||
if values[i/2] == "" {
|
||||
return Resource{}, fmt.Errorf("Found empty segment (%d)", i+1)
|
||||
}
|
||||
}
|
||||
|
||||
if !strings.EqualFold(keys[0], "subscriptions") {
|
||||
return Resource{}, fmt.Errorf("Expected first segment to be 'subscriptions', but found %q", keys[0])
|
||||
}
|
||||
|
||||
if !strings.EqualFold(keys[1], "resourceGroups") {
|
||||
return Resource{}, fmt.Errorf("Expected second segment to be 'resourceGroups', but found %q", keys[1])
|
||||
}
|
||||
|
||||
if !strings.EqualFold(keys[2], "providers") {
|
||||
return Resource{}, fmt.Errorf("Expected third segment to be 'providers', but found %q", keys[1])
|
||||
}
|
||||
|
||||
r := Resource{
|
||||
values[0],
|
||||
values[1],
|
||||
values[2],
|
||||
CompoundName(keys[3:]),
|
||||
CompoundName(values[3:]),
|
||||
}
|
||||
if err := r.Validate(); err != nil {
|
||||
return Resource{}, fmt.Errorf("Error validating resource: %w", err)
|
||||
}
|
||||
|
||||
return r, nil
|
||||
}
|
||||
|
||||
type Resource struct {
|
||||
Subscription string
|
||||
ResourceGroup string
|
||||
Provider string
|
||||
ResourceType CompoundName
|
||||
ResourceName CompoundName
|
||||
}
|
||||
|
||||
func (r Resource) String() string {
|
||||
return fmt.Sprintf(
|
||||
"/subscriptions/%s"+
|
||||
"/resourceGroups/%s"+
|
||||
"/providers/%s"+
|
||||
"/%s",
|
||||
r.Subscription,
|
||||
r.ResourceGroup,
|
||||
r.Provider,
|
||||
strings.Join(zipstrings(r.ResourceType, r.ResourceName), "/"))
|
||||
}
|
||||
|
||||
func (r Resource) Validate() error {
|
||||
if r.Subscription == "" {
|
||||
return errors.New("subscription is not set")
|
||||
}
|
||||
if r.ResourceGroup == "" {
|
||||
return errors.New("resource group is not set")
|
||||
}
|
||||
if r.Provider == "" {
|
||||
return errors.New("provider is not set")
|
||||
}
|
||||
if len(r.ResourceType) > len(r.ResourceName) {
|
||||
return errors.New("not enough values in resource name")
|
||||
}
|
||||
if len(r.ResourceType) < len(r.ResourceName) {
|
||||
return errors.New("too many values in resource name")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Parent produces a resource ID representing the parent resource if this is a child resource
|
||||
func (r Resource) Parent() (Resource, error) {
|
||||
newLen := len(r.ResourceType) - 1
|
||||
if newLen == 0 {
|
||||
return Resource{}, errors.New("Top-level resource has no parent")
|
||||
}
|
||||
return Resource{
|
||||
Subscription: r.Subscription,
|
||||
ResourceGroup: r.ResourceGroup,
|
||||
Provider: r.Provider,
|
||||
ResourceType: r.ResourceType[:newLen],
|
||||
ResourceName: r.ResourceName[:newLen],
|
||||
}, nil
|
||||
}
|
||||
|
||||
type CompoundName []string
|
||||
|
||||
func (n CompoundName) String() string {
|
||||
return strings.Join(n, "/")
|
||||
}
|
||||
|
||||
func zipstrings(a []string, b []string) []string {
|
||||
c := make([]string, 0, len(a)+len(b))
|
||||
for i := 0; i < len(a) && i < len(b); i++ {
|
||||
c = append(c, a[i], b[i])
|
||||
}
|
||||
return c
|
||||
}
|
|
@ -0,0 +1,188 @@
|
|||
package client
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestParseResourceID(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
resourceID string
|
||||
want Resource
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource",
|
||||
want: Resource{
|
||||
Subscription: "17c60680-0e49-465b-aa54-ece043ce5571",
|
||||
ResourceGroup: "rg",
|
||||
Provider: "Microsoft.Resources",
|
||||
ResourceType: CompoundName{"resources"},
|
||||
ResourceName: CompoundName{"resource"},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "sub resource",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourcegroups/rg/providers/Microsoft.Resources/resources/resource/subResources/child",
|
||||
want: Resource{
|
||||
Subscription: "17c60680-0e49-465b-aa54-ece043ce5571",
|
||||
ResourceGroup: "rg",
|
||||
Provider: "Microsoft.Resources",
|
||||
ResourceType: CompoundName{"resources", "subResources"},
|
||||
ResourceName: CompoundName{"resource", "child"},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "incomplete",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource/subResources",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "incomplete 2",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "extra slash",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources//resources",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "empty resource name",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources//subresources/child",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "empty sub resource type",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource//child",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "ungrouped resource path",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/providers/Microsoft.Resources/resources/resource",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "misspelled subscriptions",
|
||||
resourceID: "/subscription/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource/subResources/child",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "misspelled resourceGroups",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroup/rg/providers/Microsoft.Resources/resources/resource/subResources/child",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "misspelled providers",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/provider/Microsoft.Resources/resources/resource/subResources/child",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := ParseResourceID(tt.resourceID)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("ParseResourceID() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("ParseResourceID() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestResource_String(t *testing.T) {
|
||||
type fields struct {
|
||||
Subscription string
|
||||
ResourceGroup string
|
||||
Provider string
|
||||
ResourceType CompoundName
|
||||
ResourceName CompoundName
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
fields: fields{
|
||||
Subscription: "sub",
|
||||
ResourceGroup: "rg",
|
||||
Provider: "provider",
|
||||
ResourceType: CompoundName{"type"},
|
||||
ResourceName: CompoundName{"name"},
|
||||
},
|
||||
want: "/subscriptions/sub/resourceGroups/rg/providers/provider/type/name",
|
||||
},
|
||||
{
|
||||
name: "happy path - child resource",
|
||||
fields: fields{
|
||||
Subscription: "sub",
|
||||
ResourceGroup: "rg",
|
||||
Provider: "provider",
|
||||
ResourceType: CompoundName{"type", "sub"},
|
||||
ResourceName: CompoundName{"name", "child"},
|
||||
},
|
||||
want: "/subscriptions/sub/resourceGroups/rg/providers/provider/type/name/sub/child",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
r := Resource{
|
||||
Subscription: tt.fields.Subscription,
|
||||
ResourceGroup: tt.fields.ResourceGroup,
|
||||
Provider: tt.fields.Provider,
|
||||
ResourceType: tt.fields.ResourceType,
|
||||
ResourceName: tt.fields.ResourceName,
|
||||
}
|
||||
if got := r.String(); got != tt.want {
|
||||
t.Errorf("Resource.String() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestResource_Parent(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
resourceID string
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource/sub/child",
|
||||
want: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource",
|
||||
},
|
||||
{
|
||||
name: "sub sub",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource/sub/child/subsub/grandchild",
|
||||
want: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource/sub/child",
|
||||
},
|
||||
{
|
||||
name: "top level resource",
|
||||
resourceID: "/subscriptions/17c60680-0e49-465b-aa54-ece043ce5571/resourceGroups/rg/providers/Microsoft.Resources/resources/resource",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
r, err := ParseResourceID(tt.resourceID)
|
||||
if err != nil {
|
||||
t.Fatalf("Error parsing test resource: %v", err)
|
||||
}
|
||||
got, err := r.Parent()
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("Resource.Parent() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if err == nil && got.String() != tt.want {
|
||||
t.Errorf("Resource.Parent() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
|
@ -19,7 +19,7 @@ package computeapi
|
|||
|
||||
import (
|
||||
"context"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
|
@ -96,7 +96,7 @@ func (client DiskEncryptionSetsClient) CreateOrUpdatePreparer(ctx context.Contex
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ func (client DiskEncryptionSetsClient) DeletePreparer(ctx context.Context, resou
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -259,7 +259,7 @@ func (client DiskEncryptionSetsClient) GetPreparer(ctx context.Context, resource
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -331,7 +331,7 @@ func (client DiskEncryptionSetsClient) ListPreparer(ctx context.Context) (*http.
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -443,7 +443,7 @@ func (client DiskEncryptionSetsClient) ListByResourceGroupPreparer(ctx context.C
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -554,7 +554,7 @@ func (client DiskEncryptionSetsClient) UpdatePreparer(ctx context.Context, resou
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -66,6 +66,8 @@ func (client DisksClient) CreateOrUpdate(ctx context.Context, resourceGroupName
|
|||
Chain: []validation.Constraint{{Target: "disk.DiskProperties.CreationData", Name: validation.Null, Rule: true,
|
||||
Chain: []validation.Constraint{{Target: "disk.DiskProperties.CreationData.ImageReference", Name: validation.Null, Rule: false,
|
||||
Chain: []validation.Constraint{{Target: "disk.DiskProperties.CreationData.ImageReference.ID", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||
{Target: "disk.DiskProperties.CreationData.GalleryImageReference", Name: validation.Null, Rule: false,
|
||||
Chain: []validation.Constraint{{Target: "disk.DiskProperties.CreationData.GalleryImageReference.ID", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||
}},
|
||||
{Target: "disk.DiskProperties.EncryptionSettingsCollection", Name: validation.Null, Rule: false,
|
||||
Chain: []validation.Constraint{{Target: "disk.DiskProperties.EncryptionSettingsCollection.Enabled", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||
|
@ -96,12 +98,13 @@ func (client DisksClient) CreateOrUpdatePreparer(ctx context.Context, resourceGr
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
||||
disk.ManagedBy = nil
|
||||
disk.ManagedByExtended = nil
|
||||
preparer := autorest.CreatePreparer(
|
||||
autorest.AsContentType("application/json; charset=utf-8"),
|
||||
autorest.AsPut(),
|
||||
|
@ -177,7 +180,7 @@ func (client DisksClient) DeletePreparer(ctx context.Context, resourceGroupName
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -260,7 +263,7 @@ func (client DisksClient) GetPreparer(ctx context.Context, resourceGroupName str
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -339,7 +342,7 @@ func (client DisksClient) GrantAccessPreparer(ctx context.Context, resourceGroup
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -419,7 +422,7 @@ func (client DisksClient) ListPreparer(ctx context.Context) (*http.Request, erro
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -531,7 +534,7 @@ func (client DisksClient) ListByResourceGroupPreparer(ctx context.Context, resou
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -640,7 +643,7 @@ func (client DisksClient) RevokeAccessPreparer(ctx context.Context, resourceGrou
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -718,7 +721,7 @@ func (client DisksClient) UpdatePreparer(ctx context.Context, resourceGroupName
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -81,7 +81,7 @@ func (client GalleriesClient) CreateOrUpdatePreparer(ctx context.Context, resour
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -159,7 +159,7 @@ func (client GalleriesClient) DeletePreparer(ctx context.Context, resourceGroupN
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ func (client GalleriesClient) GetPreparer(ctx context.Context, resourceGroupName
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -312,7 +312,7 @@ func (client GalleriesClient) ListPreparer(ctx context.Context) (*http.Request,
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -424,7 +424,7 @@ func (client GalleriesClient) ListByResourceGroupPreparer(ctx context.Context, r
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -533,7 +533,7 @@ func (client GalleriesClient) UpdatePreparer(ctx context.Context, resourceGroupN
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -86,7 +86,7 @@ func (client GalleryApplicationsClient) CreateOrUpdatePreparer(ctx context.Conte
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ func (client GalleryApplicationsClient) DeletePreparer(ctx context.Context, reso
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -251,7 +251,7 @@ func (client GalleryApplicationsClient) GetPreparer(ctx context.Context, resourc
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -329,7 +329,7 @@ func (client GalleryApplicationsClient) ListByGalleryPreparer(ctx context.Contex
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -442,7 +442,7 @@ func (client GalleryApplicationsClient) UpdatePreparer(ctx context.Context, reso
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -103,7 +103,7 @@ func (client GalleryApplicationVersionsClient) CreateOrUpdatePreparer(ctx contex
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -186,7 +186,7 @@ func (client GalleryApplicationVersionsClient) DeletePreparer(ctx context.Contex
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -273,7 +273,7 @@ func (client GalleryApplicationVersionsClient) GetPreparer(ctx context.Context,
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -356,7 +356,7 @@ func (client GalleryApplicationVersionsClient) ListByGalleryApplicationPreparer(
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -471,7 +471,7 @@ func (client GalleryApplicationVersionsClient) UpdatePreparer(ctx context.Contex
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -97,7 +97,7 @@ func (client GalleryImagesClient) CreateOrUpdatePreparer(ctx context.Context, re
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ func (client GalleryImagesClient) DeletePreparer(ctx context.Context, resourceGr
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -260,7 +260,7 @@ func (client GalleryImagesClient) GetPreparer(ctx context.Context, resourceGroup
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -337,7 +337,7 @@ func (client GalleryImagesClient) ListByGalleryPreparer(ctx context.Context, res
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -449,7 +449,7 @@ func (client GalleryImagesClient) UpdatePreparer(ctx context.Context, resourceGr
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -99,7 +99,7 @@ func (client GalleryImageVersionsClient) CreateOrUpdatePreparer(ctx context.Cont
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -181,7 +181,7 @@ func (client GalleryImageVersionsClient) DeletePreparer(ctx context.Context, res
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -267,7 +267,7 @@ func (client GalleryImageVersionsClient) GetPreparer(ctx context.Context, resour
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -350,7 +350,7 @@ func (client GalleryImageVersionsClient) ListByGalleryImagePreparer(ctx context.
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -464,7 +464,7 @@ func (client GalleryImageVersionsClient) UpdatePreparer(ctx context.Context, res
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-12-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -29,7 +29,7 @@ import (
|
|||
)
|
||||
|
||||
// The package's fully qualified name.
|
||||
const fqdn = "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
|
||||
const fqdn = "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
|
||||
|
||||
// AccessLevel enumerates the values for access level.
|
||||
type AccessLevel string
|
||||
|
@ -277,7 +277,8 @@ const (
|
|||
Copy DiskCreateOption = "Copy"
|
||||
// Empty Create an empty data disk of a size given by diskSizeGB.
|
||||
Empty DiskCreateOption = "Empty"
|
||||
// FromImage Create a new disk from a platform image specified by the given imageReference.
|
||||
// FromImage Create a new disk from a platform image specified by the given imageReference or
|
||||
// galleryImageReference.
|
||||
FromImage DiskCreateOption = "FromImage"
|
||||
// Import Create a disk by importing from a blob specified by a sourceUri in a storage account specified by
|
||||
// storageAccountId.
|
||||
|
@ -1726,12 +1727,6 @@ type AvailabilitySetUpdate struct {
|
|||
Sku *Sku `json:"sku,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for AvailabilitySetUpdate.
|
||||
|
@ -1785,33 +1780,6 @@ func (asu *AvailabilitySetUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
asu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
err = json.Unmarshal(*v, &ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
asu.ID = &ID
|
||||
}
|
||||
case "name":
|
||||
if v != nil {
|
||||
var name string
|
||||
err = json.Unmarshal(*v, &name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
asu.Name = &name
|
||||
}
|
||||
case "type":
|
||||
if v != nil {
|
||||
var typeVar string
|
||||
err = json.Unmarshal(*v, &typeVar)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
asu.Type = &typeVar
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2265,6 +2233,8 @@ type CreationData struct {
|
|||
StorageAccountID *string `json:"storageAccountId,omitempty"`
|
||||
// ImageReference - Disk source information.
|
||||
ImageReference *ImageDiskReference `json:"imageReference,omitempty"`
|
||||
// GalleryImageReference - Required if creating from a Gallery Image. The id of the ImageDiskReference will be the ARM id of the shared galley image version from which to create a disk.
|
||||
GalleryImageReference *ImageDiskReference `json:"galleryImageReference,omitempty"`
|
||||
// SourceURI - If createOption is Import, this is the URI of a blob to be imported into a managed disk.
|
||||
SourceURI *string `json:"sourceUri,omitempty"`
|
||||
// SourceResourceID - If createOption is Copy, this is the ARM id of the source snapshot or disk.
|
||||
|
@ -2309,6 +2279,14 @@ type DataDiskImage struct {
|
|||
Lun *int32 `json:"lun,omitempty"`
|
||||
}
|
||||
|
||||
// DataDiskImageEncryption contains encryption settings for a data disk image.
|
||||
type DataDiskImageEncryption struct {
|
||||
// Lun - This property specifies the logical unit number of the data disk. This value is used to identify data disks within the Virtual Machine and therefore must be unique for each data disk attached to the Virtual Machine.
|
||||
Lun *int32 `json:"lun,omitempty"`
|
||||
// DiskEncryptionSetID - A relative URI containing the resource ID of the disk encryption set.
|
||||
DiskEncryptionSetID *string `json:"diskEncryptionSetId,omitempty"`
|
||||
}
|
||||
|
||||
// DedicatedHost specifies information about the Dedicated host.
|
||||
type DedicatedHost struct {
|
||||
autorest.Response `json:"-"`
|
||||
|
@ -2716,12 +2694,6 @@ type DedicatedHostGroupUpdate struct {
|
|||
Zones *[]string `json:"zones,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for DedicatedHostGroupUpdate.
|
||||
|
@ -2775,33 +2747,6 @@ func (dhgu *DedicatedHostGroupUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
dhgu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
err = json.Unmarshal(*v, &ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dhgu.ID = &ID
|
||||
}
|
||||
case "name":
|
||||
if v != nil {
|
||||
var name string
|
||||
err = json.Unmarshal(*v, &name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dhgu.Name = &name
|
||||
}
|
||||
case "type":
|
||||
if v != nil {
|
||||
var typeVar string
|
||||
err = json.Unmarshal(*v, &typeVar)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dhgu.Type = &typeVar
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3071,12 +3016,6 @@ type DedicatedHostUpdate struct {
|
|||
*DedicatedHostProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for DedicatedHostUpdate.
|
||||
|
@ -3118,33 +3057,6 @@ func (dhu *DedicatedHostUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
dhu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
err = json.Unmarshal(*v, &ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dhu.ID = &ID
|
||||
}
|
||||
case "name":
|
||||
if v != nil {
|
||||
var name string
|
||||
err = json.Unmarshal(*v, &name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dhu.Name = &name
|
||||
}
|
||||
case "type":
|
||||
if v != nil {
|
||||
var typeVar string
|
||||
err = json.Unmarshal(*v, &typeVar)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dhu.Type = &typeVar
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3175,8 +3087,10 @@ type Disallowed struct {
|
|||
type Disk struct {
|
||||
autorest.Response `json:"-"`
|
||||
// ManagedBy - READ-ONLY; A relative URI containing the ID of the VM that has the disk attached.
|
||||
ManagedBy *string `json:"managedBy,omitempty"`
|
||||
Sku *DiskSku `json:"sku,omitempty"`
|
||||
ManagedBy *string `json:"managedBy,omitempty"`
|
||||
// ManagedByExtended - READ-ONLY; List of relative URIs containing the IDs of the VMs that have the disk attached. maxShares should be set to a value greater than one for disks to allow attaching them to multiple VMs.
|
||||
ManagedByExtended *[]string `json:"managedByExtended,omitempty"`
|
||||
Sku *DiskSku `json:"sku,omitempty"`
|
||||
// Zones - The Logical zone list for Disk.
|
||||
Zones *[]string `json:"zones,omitempty"`
|
||||
*DiskProperties `json:"properties,omitempty"`
|
||||
|
@ -3231,6 +3145,15 @@ func (d *Disk) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
d.ManagedBy = &managedBy
|
||||
}
|
||||
case "managedByExtended":
|
||||
if v != nil {
|
||||
var managedByExtended []string
|
||||
err = json.Unmarshal(*v, &managedByExtended)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
d.ManagedByExtended = &managedByExtended
|
||||
}
|
||||
case "sku":
|
||||
if v != nil {
|
||||
var sku DiskSku
|
||||
|
@ -3724,6 +3647,12 @@ type DiskEncryptionSetUpdateProperties struct {
|
|||
ActiveKey *KeyVaultAndKeyReference `json:"activeKey,omitempty"`
|
||||
}
|
||||
|
||||
// DiskImageEncryption this is the disk image encryption base class.
|
||||
type DiskImageEncryption struct {
|
||||
// DiskEncryptionSetID - A relative URI containing the resource ID of the disk encryption set.
|
||||
DiskEncryptionSetID *string `json:"diskEncryptionSetId,omitempty"`
|
||||
}
|
||||
|
||||
// DiskInstanceView the instance view of the disk.
|
||||
type DiskInstanceView struct {
|
||||
// Name - The disk name.
|
||||
|
@ -3903,11 +3832,19 @@ type DiskProperties struct {
|
|||
// DiskIOPSReadWrite - The number of IOPS allowed for this disk; only settable for UltraSSD disks. One operation can transfer between 4k and 256k bytes.
|
||||
DiskIOPSReadWrite *int64 `json:"diskIOPSReadWrite,omitempty"`
|
||||
// DiskMBpsReadWrite - The bandwidth allowed for this disk; only settable for UltraSSD disks. MBps means millions of bytes per second - MB here uses the ISO notation, of powers of 10.
|
||||
DiskMBpsReadWrite *int32 `json:"diskMBpsReadWrite,omitempty"`
|
||||
DiskMBpsReadWrite *int64 `json:"diskMBpsReadWrite,omitempty"`
|
||||
// DiskIOPSReadOnly - The total number of IOPS that will be allowed across all VMs mounting the shared disk as ReadOnly. One operation can transfer between 4k and 256k bytes.
|
||||
DiskIOPSReadOnly *int64 `json:"diskIOPSReadOnly,omitempty"`
|
||||
// DiskMBpsReadOnly - The total throughput (MBps) that will be allowed across all VMs mounting the shared disk as ReadOnly. MBps means millions of bytes per second - MB here uses the ISO notation, of powers of 10.
|
||||
DiskMBpsReadOnly *int64 `json:"diskMBpsReadOnly,omitempty"`
|
||||
// DiskState - READ-ONLY; The state of the disk. Possible values include: 'Unattached', 'Attached', 'Reserved', 'ActiveSAS', 'ReadyToUpload', 'ActiveUpload'
|
||||
DiskState DiskState `json:"diskState,omitempty"`
|
||||
// Encryption - Encryption property can be used to encrypt data at rest with customer managed keys or platform managed keys.
|
||||
Encryption *Encryption `json:"encryption,omitempty"`
|
||||
// MaxShares - The maximum number of VMs that can attach to the disk at the same time. Value greater than one indicates a disk that can be mounted on multiple VMs at the same time.
|
||||
MaxShares *int32 `json:"maxShares,omitempty"`
|
||||
// ShareInfo - READ-ONLY; Details of the list of all VMs that have the disk attached. maxShares should be set to a value greater than one for disks to allow attaching them to multiple VMs.
|
||||
ShareInfo *[]ShareInfoElement `json:"shareInfo,omitempty"`
|
||||
}
|
||||
|
||||
// DisksCreateOrUpdateFuture an abstraction for monitoring and retrieving the results of a long-running
|
||||
|
@ -4125,7 +4062,13 @@ type DiskUpdateProperties struct {
|
|||
// DiskIOPSReadWrite - The number of IOPS allowed for this disk; only settable for UltraSSD disks. One operation can transfer between 4k and 256k bytes.
|
||||
DiskIOPSReadWrite *int64 `json:"diskIOPSReadWrite,omitempty"`
|
||||
// DiskMBpsReadWrite - The bandwidth allowed for this disk; only settable for UltraSSD disks. MBps means millions of bytes per second - MB here uses the ISO notation, of powers of 10.
|
||||
DiskMBpsReadWrite *int32 `json:"diskMBpsReadWrite,omitempty"`
|
||||
DiskMBpsReadWrite *int64 `json:"diskMBpsReadWrite,omitempty"`
|
||||
// DiskIOPSReadOnly - The total number of IOPS that will be allowed across all VMs mounting the shared disk as ReadOnly. One operation can transfer between 4k and 256k bytes.
|
||||
DiskIOPSReadOnly *int64 `json:"diskIOPSReadOnly,omitempty"`
|
||||
// DiskMBpsReadOnly - The total throughput (MBps) that will be allowed across all VMs mounting the shared disk as ReadOnly. MBps means millions of bytes per second - MB here uses the ISO notation, of powers of 10.
|
||||
DiskMBpsReadOnly *int64 `json:"diskMBpsReadOnly,omitempty"`
|
||||
// MaxShares - The maximum number of VMs that can attach to the disk at the same time. Value greater than one indicates a disk that can be mounted on multiple VMs at the same time.
|
||||
MaxShares *int32 `json:"maxShares,omitempty"`
|
||||
// Encryption - Encryption property can be used to encrypt data at rest with customer managed keys or platform managed keys.
|
||||
Encryption *Encryption `json:"encryption,omitempty"`
|
||||
}
|
||||
|
@ -4138,6 +4081,14 @@ type Encryption struct {
|
|||
Type EncryptionType `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// EncryptionImages optional. Allows users to provide customer managed keys for encrypting the OS and data
|
||||
// disks in the gallery artifact.
|
||||
type EncryptionImages struct {
|
||||
OsDiskImage *OSDiskImageEncryption `json:"osDiskImage,omitempty"`
|
||||
// DataDiskImages - A list of encryption specifications for data disk images.
|
||||
DataDiskImages *[]DataDiskImageEncryption `json:"dataDiskImages,omitempty"`
|
||||
}
|
||||
|
||||
// EncryptionSetIdentity the managed identity for the disk encryption set. It should be given permission on
|
||||
// the key vault before it can be used to encrypt disks.
|
||||
type EncryptionSetIdentity struct {
|
||||
|
@ -4706,14 +4657,14 @@ func (future *GalleryApplicationsUpdateFuture) Result(client GalleryApplications
|
|||
// update.
|
||||
type GalleryApplicationUpdate struct {
|
||||
*GalleryApplicationProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for GalleryApplicationUpdate.
|
||||
|
@ -4746,15 +4697,6 @@ func (gau *GalleryApplicationUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
gau.GalleryApplicationProperties = &galleryApplicationProperties
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gau.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
|
@ -4782,6 +4724,15 @@ func (gau *GalleryApplicationUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
gau.Type = &typeVar
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gau.Tags = tags
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5151,14 +5102,14 @@ func (future *GalleryApplicationVersionsUpdateFuture) Result(client GalleryAppli
|
|||
// want to update.
|
||||
type GalleryApplicationVersionUpdate struct {
|
||||
*GalleryApplicationVersionProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for GalleryApplicationVersionUpdate.
|
||||
|
@ -5191,15 +5142,6 @@ func (gavu *GalleryApplicationVersionUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
gavu.GalleryApplicationVersionProperties = &galleryApplicationVersionProperties
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gavu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
|
@ -5227,6 +5169,15 @@ func (gavu *GalleryApplicationVersionUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
gavu.Type = &typeVar
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gavu.Tags = tags
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5652,14 +5603,14 @@ func (future *GalleryImagesUpdateFuture) Result(client GalleryImagesClient) (gi
|
|||
// GalleryImageUpdate specifies information about the gallery Image Definition that you want to update.
|
||||
type GalleryImageUpdate struct {
|
||||
*GalleryImageProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for GalleryImageUpdate.
|
||||
|
@ -5692,15 +5643,6 @@ func (giu *GalleryImageUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
giu.GalleryImageProperties = &galleryImageProperties
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
giu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
|
@ -5728,6 +5670,15 @@ func (giu *GalleryImageUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
giu.Type = &typeVar
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
giu.Tags = tags
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6099,14 +6050,14 @@ func (future *GalleryImageVersionsUpdateFuture) Result(client GalleryImageVersio
|
|||
// GalleryImageVersionUpdate specifies information about the gallery Image Version that you want to update.
|
||||
type GalleryImageVersionUpdate struct {
|
||||
*GalleryImageVersionProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for GalleryImageVersionUpdate.
|
||||
|
@ -6139,15 +6090,6 @@ func (givu *GalleryImageVersionUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
givu.GalleryImageVersionProperties = &galleryImageVersionProperties
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
givu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
|
@ -6175,6 +6117,15 @@ func (givu *GalleryImageVersionUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
givu.Type = &typeVar
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
givu.Tags = tags
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6348,14 +6299,14 @@ type GalleryProperties struct {
|
|||
// GalleryUpdate specifies information about the Shared Image Gallery that you want to update.
|
||||
type GalleryUpdate struct {
|
||||
*GalleryProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for GalleryUpdate.
|
||||
|
@ -6388,15 +6339,6 @@ func (gu *GalleryUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
gu.GalleryProperties = &galleryProperties
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
|
@ -6424,6 +6366,15 @@ func (gu *GalleryUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
gu.Type = &typeVar
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gu.Tags = tags
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6896,12 +6847,6 @@ type ImageUpdate struct {
|
|||
*ImageProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for ImageUpdate.
|
||||
|
@ -6943,33 +6888,6 @@ func (iu *ImageUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
iu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
err = json.Unmarshal(*v, &ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
iu.ID = &ID
|
||||
}
|
||||
case "name":
|
||||
if v != nil {
|
||||
var name string
|
||||
err = json.Unmarshal(*v, &name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
iu.Name = &name
|
||||
}
|
||||
case "type":
|
||||
if v != nil {
|
||||
var typeVar string
|
||||
err = json.Unmarshal(*v, &typeVar)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
iu.Type = &typeVar
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7501,6 +7419,12 @@ type OSDiskImage struct {
|
|||
OperatingSystem OperatingSystemTypes `json:"operatingSystem,omitempty"`
|
||||
}
|
||||
|
||||
// OSDiskImageEncryption contains encryption settings for an OS disk image.
|
||||
type OSDiskImageEncryption struct {
|
||||
// DiskEncryptionSetID - A relative URI containing the resource ID of the disk encryption set.
|
||||
DiskEncryptionSetID *string `json:"diskEncryptionSetId,omitempty"`
|
||||
}
|
||||
|
||||
// OSProfile specifies the operating system settings for the virtual machine. Some of the settings cannot
|
||||
// be changed once VM is provisioned.
|
||||
type OSProfile struct {
|
||||
|
@ -7806,12 +7730,6 @@ type ProximityPlacementGroupProperties struct {
|
|||
type ProximityPlacementGroupUpdate struct {
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for ProximityPlacementGroupUpdate.
|
||||
|
@ -8552,6 +8470,12 @@ type ScheduledEventsProfile struct {
|
|||
TerminateNotificationProfile *TerminateNotificationProfile `json:"terminateNotificationProfile,omitempty"`
|
||||
}
|
||||
|
||||
// ShareInfoElement ...
|
||||
type ShareInfoElement struct {
|
||||
// VMURI - READ-ONLY; A relative URI containing the ID of the VM that has the disk attached.
|
||||
VMURI *string `json:"vmUri,omitempty"`
|
||||
}
|
||||
|
||||
// Sku describes a virtual machine scale set sku.
|
||||
type Sku struct {
|
||||
// Name - The sku name.
|
||||
|
@ -9136,6 +9060,7 @@ type TargetRegion struct {
|
|||
RegionalReplicaCount *int32 `json:"regionalReplicaCount,omitempty"`
|
||||
// StorageAccountType - Specifies the storage account type to be used to store the image. This property is not updatable. Possible values include: 'StorageAccountTypeStandardLRS', 'StorageAccountTypeStandardZRS'
|
||||
StorageAccountType StorageAccountType `json:"storageAccountType,omitempty"`
|
||||
Encryption *EncryptionImages `json:"encryption,omitempty"`
|
||||
}
|
||||
|
||||
// TerminateNotificationProfile ...
|
||||
|
@ -9166,12 +9091,6 @@ type ThrottledRequestsInput struct {
|
|||
type UpdateResource struct {
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for UpdateResource.
|
||||
|
@ -9183,6 +9102,27 @@ func (ur UpdateResource) MarshalJSON() ([]byte, error) {
|
|||
return json.Marshal(objectMap)
|
||||
}
|
||||
|
||||
// UpdateResourceDefinition the Update Resource model definition.
|
||||
type UpdateResourceDefinition struct {
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for UpdateResourceDefinition.
|
||||
func (urd UpdateResourceDefinition) MarshalJSON() ([]byte, error) {
|
||||
objectMap := make(map[string]interface{})
|
||||
if urd.Tags != nil {
|
||||
objectMap["tags"] = urd.Tags
|
||||
}
|
||||
return json.Marshal(objectMap)
|
||||
}
|
||||
|
||||
// UpgradeOperationHistoricalStatusInfo virtual Machine Scale Set OS Upgrade History operation response.
|
||||
type UpgradeOperationHistoricalStatusInfo struct {
|
||||
// Properties - READ-ONLY; Information about the properties of the upgrade operation.
|
||||
|
@ -9822,12 +9762,6 @@ type VirtualMachineExtensionUpdate struct {
|
|||
*VirtualMachineExtensionUpdateProperties `json:"properties,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for VirtualMachineExtensionUpdate.
|
||||
|
@ -9869,33 +9803,6 @@ func (vmeu *VirtualMachineExtensionUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
vmeu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
err = json.Unmarshal(*v, &ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmeu.ID = &ID
|
||||
}
|
||||
case "name":
|
||||
if v != nil {
|
||||
var name string
|
||||
err = json.Unmarshal(*v, &name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmeu.Name = &name
|
||||
}
|
||||
case "type":
|
||||
if v != nil {
|
||||
var typeVar string
|
||||
err = json.Unmarshal(*v, &typeVar)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmeu.Type = &typeVar
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12317,12 +12224,6 @@ type VirtualMachineScaleSetUpdate struct {
|
|||
Identity *VirtualMachineScaleSetIdentity `json:"identity,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for VirtualMachineScaleSetUpdate.
|
||||
|
@ -12400,33 +12301,6 @@ func (vmssu *VirtualMachineScaleSetUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
vmssu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
err = json.Unmarshal(*v, &ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmssu.ID = &ID
|
||||
}
|
||||
case "name":
|
||||
if v != nil {
|
||||
var name string
|
||||
err = json.Unmarshal(*v, &name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmssu.Name = &name
|
||||
}
|
||||
case "type":
|
||||
if v != nil {
|
||||
var typeVar string
|
||||
err = json.Unmarshal(*v, &typeVar)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmssu.Type = &typeVar
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13927,12 +13801,6 @@ type VirtualMachineUpdate struct {
|
|||
Zones *[]string `json:"zones,omitempty"`
|
||||
// Tags - Resource tags
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// ID - READ-ONLY; Resource Id
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; Resource name
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; Resource type
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for VirtualMachineUpdate.
|
||||
|
@ -14010,33 +13878,6 @@ func (vmu *VirtualMachineUpdate) UnmarshalJSON(body []byte) error {
|
|||
}
|
||||
vmu.Tags = tags
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
err = json.Unmarshal(*v, &ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmu.ID = &ID
|
||||
}
|
||||
case "name":
|
||||
if v != nil {
|
||||
var name string
|
||||
err = json.Unmarshal(*v, &name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmu.Name = &name
|
||||
}
|
||||
case "type":
|
||||
if v != nil {
|
||||
var typeVar string
|
||||
err = json.Unmarshal(*v, &typeVar)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vmu.Type = &typeVar
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -65,6 +65,8 @@ func (client SnapshotsClient) CreateOrUpdate(ctx context.Context, resourceGroupN
|
|||
Chain: []validation.Constraint{{Target: "snapshot.SnapshotProperties.CreationData", Name: validation.Null, Rule: true,
|
||||
Chain: []validation.Constraint{{Target: "snapshot.SnapshotProperties.CreationData.ImageReference", Name: validation.Null, Rule: false,
|
||||
Chain: []validation.Constraint{{Target: "snapshot.SnapshotProperties.CreationData.ImageReference.ID", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||
{Target: "snapshot.SnapshotProperties.CreationData.GalleryImageReference", Name: validation.Null, Rule: false,
|
||||
Chain: []validation.Constraint{{Target: "snapshot.SnapshotProperties.CreationData.GalleryImageReference.ID", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||
}},
|
||||
{Target: "snapshot.SnapshotProperties.EncryptionSettingsCollection", Name: validation.Null, Rule: false,
|
||||
Chain: []validation.Constraint{{Target: "snapshot.SnapshotProperties.EncryptionSettingsCollection.Enabled", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||
|
@ -95,7 +97,7 @@ func (client SnapshotsClient) CreateOrUpdatePreparer(ctx context.Context, resour
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -175,7 +177,7 @@ func (client SnapshotsClient) DeletePreparer(ctx context.Context, resourceGroupN
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -257,7 +259,7 @@ func (client SnapshotsClient) GetPreparer(ctx context.Context, resourceGroupName
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -335,7 +337,7 @@ func (client SnapshotsClient) GrantAccessPreparer(ctx context.Context, resourceG
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -415,7 +417,7 @@ func (client SnapshotsClient) ListPreparer(ctx context.Context) (*http.Request,
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -527,7 +529,7 @@ func (client SnapshotsClient) ListByResourceGroupPreparer(ctx context.Context, r
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -635,7 +637,7 @@ func (client SnapshotsClient) RevokeAccessPreparer(ctx context.Context, resource
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
@ -712,7 +714,7 @@ func (client SnapshotsClient) UpdatePreparer(ctx context.Context, resourceGroupN
|
|||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||
}
|
||||
|
||||
const APIVersion = "2019-07-01"
|
||||
const APIVersion = "2019-11-01"
|
||||
queryParameters := map[string]interface{}{
|
||||
"api-version": APIVersion,
|
||||
}
|
|
@ -21,7 +21,7 @@ import "github.com/Azure/azure-sdk-for-go/version"
|
|||
|
||||
// UserAgent returns the UserAgent string to use when sending http.Requests.
|
||||
func UserAgent() string {
|
||||
return "Azure-SDK-For-Go/" + version.Number + " compute/2019-07-01"
|
||||
return "Azure-SDK-For-Go/" + version.Number + " compute/2019-12-01"
|
||||
}
|
||||
|
||||
// Version returns the semantic version (see http://semver.org) of the client.
|
|
@ -13,8 +13,8 @@ github.com/1and1/oneandone-cloudserver-sdk-go
|
|||
# github.com/Azure/azure-sdk-for-go v40.5.0+incompatible
|
||||
github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-04-01/compute
|
||||
github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-03-01/compute
|
||||
github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute
|
||||
github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute/computeapi
|
||||
github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute
|
||||
github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute/computeapi
|
||||
github.com/Azure/azure-sdk-for-go/services/devtestlabs/mgmt/2018-09-15/dtl
|
||||
github.com/Azure/azure-sdk-for-go/services/keyvault/mgmt/2018-02-14/keyvault
|
||||
github.com/Azure/azure-sdk-for-go/services/network/mgmt/2018-01-01/network
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<!-- Code generated from the comments of the Config struct in builder/azure/chroot/builder.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `source` (string) - Either a managed disk resource ID or a publisher:offer:sku:version specifier for plaform image sources.
|
||||
- `source` (string) - One of the following can be used as a source for an image:
|
||||
- a shared image version resource ID
|
||||
- a managed disk resource ID
|
||||
- a publisher:offer:sku:version specifier for plaform image sources.
|
||||
|
Loading…
Reference in New Issue