Merge pull request #6269 from harijayms/asyncrgdelete
Async delete Resource Group
This commit is contained in:
commit
a5530d4546
|
@ -347,6 +347,7 @@ func (b *Builder) configureStateBag(stateBag multistep.StateBag) {
|
||||||
stateBag.Put(constants.ArmIsManagedImage, b.config.isManagedImage())
|
stateBag.Put(constants.ArmIsManagedImage, b.config.isManagedImage())
|
||||||
stateBag.Put(constants.ArmManagedImageResourceGroupName, b.config.ManagedImageResourceGroupName)
|
stateBag.Put(constants.ArmManagedImageResourceGroupName, b.config.ManagedImageResourceGroupName)
|
||||||
stateBag.Put(constants.ArmManagedImageName, b.config.ManagedImageName)
|
stateBag.Put(constants.ArmManagedImageName, b.config.ManagedImageName)
|
||||||
|
stateBag.Put(constants.ArmAsyncResourceGroupDelete, b.config.AsyncResourceGroupDelete)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parameters that are only known at runtime after querying Azure.
|
// Parameters that are only known at runtime after querying Azure.
|
||||||
|
|
|
@ -25,6 +25,7 @@ func TestStateBagShouldBePopulatedExpectedValues(t *testing.T) {
|
||||||
constants.ArmStorageAccountName,
|
constants.ArmStorageAccountName,
|
||||||
constants.ArmVirtualMachineCaptureParameters,
|
constants.ArmVirtualMachineCaptureParameters,
|
||||||
constants.ArmPublicIPAddressName,
|
constants.ArmPublicIPAddressName,
|
||||||
|
constants.ArmAsyncResourceGroupDelete,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, v := range expectedStateBagKeys {
|
for _, v := range expectedStateBagKeys {
|
||||||
|
|
|
@ -151,6 +151,9 @@ type Config struct {
|
||||||
|
|
||||||
Comm communicator.Config `mapstructure:",squash"`
|
Comm communicator.Config `mapstructure:",squash"`
|
||||||
ctx *interpolate.Context
|
ctx *interpolate.Context
|
||||||
|
|
||||||
|
//Cleanup
|
||||||
|
AsyncResourceGroupDelete bool `mapstructure:"async_resourcegroup_delete"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type keyVaultCertificate struct {
|
type keyVaultCertificate struct {
|
||||||
|
|
|
@ -1264,6 +1264,73 @@ func TestConfigShouldAllowTempNameOverrides(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConfigShouldAllowAsyncResourceGroupOverride(t *testing.T) {
|
||||||
|
config := map[string]interface{}{
|
||||||
|
"image_offer": "ignore",
|
||||||
|
"image_publisher": "ignore",
|
||||||
|
"image_sku": "ignore",
|
||||||
|
"location": "ignore",
|
||||||
|
"subscription_id": "ignore",
|
||||||
|
"communicator": "none",
|
||||||
|
"os_type": "linux",
|
||||||
|
"managed_image_name": "ignore",
|
||||||
|
"managed_image_resource_group_name": "ignore",
|
||||||
|
"async_resourcegroup_delete": "true",
|
||||||
|
}
|
||||||
|
|
||||||
|
c, _, err := newConfig(config, getPackerConfiguration())
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("newConfig failed with %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.AsyncResourceGroupDelete != true {
|
||||||
|
t.Errorf("expected async_resourcegroup_delete to be %q, but got %t", "async_resourcegroup_delete", c.AsyncResourceGroupDelete)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestConfigShouldAllowAsyncResourceGroupOverrideNoValue(t *testing.T) {
|
||||||
|
config := map[string]interface{}{
|
||||||
|
"image_offer": "ignore",
|
||||||
|
"image_publisher": "ignore",
|
||||||
|
"image_sku": "ignore",
|
||||||
|
"location": "ignore",
|
||||||
|
"subscription_id": "ignore",
|
||||||
|
"communicator": "none",
|
||||||
|
"os_type": "linux",
|
||||||
|
"managed_image_name": "ignore",
|
||||||
|
"managed_image_resource_group_name": "ignore",
|
||||||
|
}
|
||||||
|
|
||||||
|
c, _, err := newConfig(config, getPackerConfiguration())
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("newConfig failed with %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.AsyncResourceGroupDelete != false {
|
||||||
|
t.Errorf("expected async_resourcegroup_delete to be %q, but got %t", "async_resourcegroup_delete", c.AsyncResourceGroupDelete)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestConfigShouldAllowAsyncResourceGroupOverrideBadValue(t *testing.T) {
|
||||||
|
config := map[string]interface{}{
|
||||||
|
"image_offer": "ignore",
|
||||||
|
"image_publisher": "ignore",
|
||||||
|
"image_sku": "ignore",
|
||||||
|
"location": "ignore",
|
||||||
|
"subscription_id": "ignore",
|
||||||
|
"communicator": "none",
|
||||||
|
"os_type": "linux",
|
||||||
|
"managed_image_name": "ignore",
|
||||||
|
"managed_image_resource_group_name": "ignore",
|
||||||
|
"async_resourcegroup_delete": "asdasda",
|
||||||
|
}
|
||||||
|
|
||||||
|
c, _, err := newConfig(config, getPackerConfiguration())
|
||||||
|
if err != nil && c == nil {
|
||||||
|
t.Log("newConfig failed which is expected ", err)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func getArmBuilderConfiguration() map[string]string {
|
func getArmBuilderConfiguration() map[string]string {
|
||||||
m := make(map[string]string)
|
m := make(map[string]string)
|
||||||
for _, v := range requiredConfigValues {
|
for _, v := range requiredConfigValues {
|
||||||
|
|
|
@ -118,14 +118,20 @@ func (s *StepCreateResourceGroup) Cleanup(state multistep.StateBag) {
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
f, err := s.client.GroupsClient.Delete(ctx, resourceGroupName)
|
f, err := s.client.GroupsClient.Delete(ctx, resourceGroupName)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
err = f.WaitForCompletion(ctx, s.client.GroupsClient.Client)
|
if state.Get(constants.ArmAsyncResourceGroupDelete).(bool) {
|
||||||
|
s.say(fmt.Sprintf("\n Not waiting for Resource Group delete as requested by user. Resource Group Name is %s", resourceGroupName))
|
||||||
|
} else {
|
||||||
|
err = f.WaitForCompletion(ctx, s.client.GroupsClient.Client)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ui.Error(fmt.Sprintf("Error deleting resource group. Please delete it manually.\n\n"+
|
ui.Error(fmt.Sprintf("Error deleting resource group. Please delete it manually.\n\n"+
|
||||||
"Name: %s\n"+
|
"Name: %s\n"+
|
||||||
"Error: %s", resourceGroupName, err))
|
"Error: %s", resourceGroupName, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !state.Get(constants.ArmAsyncResourceGroupDelete).(bool) {
|
||||||
|
ui.Say("Resource group has been deleted.")
|
||||||
}
|
}
|
||||||
|
|
||||||
ui.Say("Resource group has been deleted.")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,13 @@ func (s *StepDeleteResourceGroup) deleteResourceGroup(ctx context.Context, state
|
||||||
s.say("\nThe resource group was created by Packer, deleting ...")
|
s.say("\nThe resource group was created by Packer, deleting ...")
|
||||||
f, err := s.client.GroupsClient.Delete(ctx, resourceGroupName)
|
f, err := s.client.GroupsClient.Delete(ctx, resourceGroupName)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
f.WaitForCompletion(ctx, s.client.GroupsClient.Client)
|
if state.Get(constants.ArmAsyncResourceGroupDelete).(bool) {
|
||||||
|
// No need to wait for the complition for delete if request is Accepted
|
||||||
|
s.say(fmt.Sprintf("\nResource Group is being deleted, not waiting for deletion due to config. Resource Group Name '%s'", resourceGroupName))
|
||||||
|
} else {
|
||||||
|
f.WaitForCompletion(ctx, s.client.GroupsClient.Client)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -35,4 +35,5 @@ const (
|
||||||
ArmManagedImageResourceGroupName string = "arm.ManagedImageResourceGroupName"
|
ArmManagedImageResourceGroupName string = "arm.ManagedImageResourceGroupName"
|
||||||
ArmManagedImageLocation string = "arm.ManagedImageLocation"
|
ArmManagedImageLocation string = "arm.ManagedImageLocation"
|
||||||
ArmManagedImageName string = "arm.ManagedImageName"
|
ArmManagedImageName string = "arm.ManagedImageName"
|
||||||
|
ArmAsyncResourceGroupDelete string = "arm.AsyncResourceGroupDelete"
|
||||||
)
|
)
|
||||||
|
|
|
@ -220,6 +220,9 @@ Providing `temp_resource_group_name` or `location` in combination with `build_re
|
||||||
|
|
||||||
CLI example `azure vm sizes -l westus`
|
CLI example `azure vm sizes -l westus`
|
||||||
|
|
||||||
|
- `async_resourcegroup_delete` (boolean) If you want packer to delete the temporary resource group asynchronously set this value. It's a boolean value
|
||||||
|
and defaults to false. **Important** Setting this true means that your builds are faster, however any failed deletes are not reported.
|
||||||
|
|
||||||
## Basic Example
|
## Basic Example
|
||||||
|
|
||||||
Here is a basic example for Azure.
|
Here is a basic example for Azure.
|
||||||
|
|
Loading…
Reference in New Issue