Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Azure Batch - Pool #2461

Merged
merged 21 commits into from Jan 9, 2019
Merged

Conversation

jcorioland
Copy link
Contributor

@jcorioland jcorioland commented Dec 6, 2018

This PR brings support for Azure Batch Pool.

Fixes #2427 and #2458
Depends on #2428

Azure Batch Pool:

  • Data Source
  • Resource
  • Tests
  • Examples
  • Website documentation

@tombuildsstuff
Copy link
Member

@jcorioland thanks for splitting this out :)

Given this is dependent on #2427 - just to let you know I'm going to take a look through the commit specific to this PR, rather than attempting to re-review the bits present in the other PR (to hopefully avoids any conflicts)

@ghost ghost added the documentation label Dec 12, 2018
@jcorioland jcorioland changed the title [WIP] Support for Azure Batch - Pool Support for Azure Batch - Pool Dec 13, 2018
@tombuildsstuff
Copy link
Member

@jcorioland I've merged master into this branch so those changes don't appear in the diff now that the other PR's been merged, I hope you don't mind

@jcorioland
Copy link
Contributor Author

@tombuildsstuff nope, this is perfect, thank you.
Was looking on the issue #2458 - not sure it require a new resource and being implemented in another PR as the start task is actually part of the Batch PoolProperties in the Azure SDK for Go.
So I just need to add required properties in the schema of resource/data source and implement the start task in the Create/Update/Read functions.

What do you think about? Better to do it in this PR or a new one?
Thanks

Copy link
Collaborator

@katbyte katbyte left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jcorioland,

Thank you for the resource! I've left some comments inline and its off to a good start. My main concern is that i think the autoscale settings should be moved into sub blocks to match the API, as well as allow for some simpler logic.

With regards to the Start Task i think it should be a sub block in this resource. It could be part of this PR or another 🙂

},
"storage_image_reference": {
Type: schema.TypeSet,
Optional: true,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe we can remove this as it's a datasource?

Suggested change
Optional: true,

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

Type: schema.TypeSet,
Optional: true,
Computed: true,
ForceNew: true,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe we can remove this as it's a datasource?

Suggested change
ForceNew: true,

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

Optional: true,
Computed: true,
ForceNew: true,
MaxItems: 1,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe we can remove this as it's a datasource?

Suggested change
MaxItems: 1,

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Optional: true,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the ForceNew be removed and optional changed to Computed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, it should. Done.


"offer": {
Type: schema.TypeString,
Optional: true,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the ForceNew be removed and optional changed to Computed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep it should. Done.

vm_size = "Standard_A1"
scale_mode = "Fixed"
target_dedicated_nodes = 2
node_agent_sku_id = "batch.node.ubuntu 16.04"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we fix the alignment here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

scale_mode = "Auto"
autoscale_evaluation_interval = "PT15M"
autoscale_formula = <<EOF
startingNumberOfVMs = 1;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we fix the assignment alignment here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

resource_group_name = "${azurerm_resource_group.rg.name}"
account_name = "${azurerm_batch_account.batch.name}"
display_name = "Fixed Scale Pool"
vm_size = "Standard_A1"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we run terraform ft on this file to fix the alignment? you can just point it at the folder and it'll find and fmt all terraform files 🙂

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

}

resource "azurerm_batch_pool" "test" {
name = "testaccpool"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we fix the alignment here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.


* `autoscale_formula` - The formula used to autoscale the pool when using scale mode `Auto`.

* `storage_image_reference` - The reference of the storage image used by the nodes in the Batch pool.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we add an import section here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

@jcorioland jcorioland changed the title Support for Azure Batch - Pool [WIP] Support for Azure Batch - Pool Dec 18, 2018
@jcorioland
Copy link
Contributor Author

@katbyte - Thanks for the review. I've done some refactoring and most of the changes you've asked for are done.
I will implement start task part of this PR, it does not make sense to create another one, indeed.

@ghost ghost removed the waiting-response label Dec 18, 2018
Copy link
Member

@tombuildsstuff tombuildsstuff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hey @jcorioland

Thanks for pushing those changes - I've taken a look though and left some comments inline, in general this is off to a good start but I've got some questions/thoughts around the design of the schema (such as making things Lists rather than Sets)

Thanks!

Required: true,
ValidateFunc: azure.ValidateAzureRMBatchPoolName,
},
"resource_group_name": resourceGroupNameDiffSuppressSchema(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unfortunately whilst this is case insensitive in some Azure API's - in others (where these ID's can be use) they're not; as such we treat Resource Group Name's as case sensitive - and we need to update this to be case-sensitive:

Suggested change
"resource_group_name": resourceGroupNameDiffSuppressSchema(),
"resource_group_name": resourceGroupNameForDataSourceSchema(),

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, got it. Thanks for the explanation.

},
"fixed_scale": azure.SchemaBatchPoolFixedScaleForDataSource(),
"auto_scale": azure.SchemaBatchPoolAutoScaleForDataSource(),
"storage_image_reference": azure.SchemaBatchPoolImageReferenceForDataSource(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since these are only used in a single place (and unlikely to be used outside of this resource) - we can define these in-line rather than splitting these out

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok.

Type: schema.TypeString,
Computed: true,
},
"start_task": azure.SchemaBatchPoolStartTaskForDataSource(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(same here)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok.

d.Set("name", name)
d.Set("account_name", accountName)
d.Set("resource_group_name", resourceGroup)
d.Set("vm_size", resp.VMSize)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since these properties are present at properties in the response, can we access them via:

if props := resp.PoolProperties; props != nil {
  d.Set("vm_size", props.VMSize)

  // ...
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. I am curious about the exact reason behind this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Azure API returns the representation of a resource at the last time it was modified; meaning if it’s not been modified in a while (for example if it was made during a Preview API) the structure returned from the API may not necessarily match the result we expect. As such we ensure we access these fields in the Properties block, since that’s where we expect them

d.Set("resource_group_name", resourceGroup)
d.Set("vm_size", resp.VMSize)

if resp.ScaleSettings != nil {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(same here) we should be able to make this:

if props := ...; props != nil {
  if settings := props.ScaleSettings; settings != nil {
    if err := d.Set("auto_scale", flattenBatchPoolAutoScaleSettings(settings.AutoScale)); err != nil {
      return fmt.Errorf("Error flattening `auto_scale`: %+v", err)
    }
    if err := d.Set("fixed_scale", flattenBatchPoolFixedScaleSettings(settings.FixedScale)); err != nil {
      return fmt.Errorf("Error flattening `fixed_scale `: %+v", err)
    }
  }
}

in this updated snippet we also handle settings.AutoScale and settings.FixedScale being nil within the flatten function and return an empty list if that's the case

d.Set("resource_group_name", resourceGroup)
d.Set("vm_size", resp.VMSize)

if resp.ScaleSettings != nil {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(as above) can we access these within the properties block e.g.

if props := resp.PoolProperties; props != nil {
  // ...
}

TargetLowPriorityNodes: &targetLowPriorityNodes,
}
} else {
return nil, fmt.Errorf("Error: scale mode should be either AutoScale of FixedScale")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is covered above - so we should be able to remove this else block here?

# client_id = "..."
# client_secret = "..."
# tenant_id = "..."
# if you're using a Service Principal (shared account) then either set the environment variables, or fill these in: # subscription_id = "..." # client_id = "..." # client_secret = "..." # tenant_id = "..."
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we put this back on multiple lines?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for the record, terraform fmt inline the comments :-)

pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
EOF
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for this to be detected correctly the EOF needs to be at the start of the line here:

Suggested change
EOF
EOF

pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
EOF
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(as above) this needs to be at the start of the line to take effect:

Suggested change
EOF
EOF

@jcorioland
Copy link
Contributor Author

jcorioland commented Dec 20, 2018

@tombuildsstuff @katbyte - I've done updates after Tom's review. I have issues with the acceptance tests now. They all end with the following error:

--- FAIL: TestAccAzureRMBatchPool_basic (699.32s)
    testing.go:538: Step 0 error: After applying this step, the plan was not empty:
        
        DIFF:
        
        DESTROY/CREATE: azurerm_batch_pool.test
          account_name:                            "testaccbatchc3tm" => "testaccbatchc3tm"
          fixed_scale.#:                           "1" => "1"
          fixed_scale.0.resize_timeout:            "PT15M" => "PT15M"
          fixed_scale.0.target_dedicated_nodes:    "1" => "1"
          fixed_scale.0.target_low_priority_nodes: "0" => "0"
          name:                                    "testaccpoolc3tm" => "testaccpoolc3tm"
          node_agent_sku_id:                       "batch.node.ubuntu 16.04" => "batch.node.ubuntu 16.04"
          resource_group_name:                     "testaccbatch8903972532148945948" => "testaccbatch8903972532148945948"
          stop_pending_resize_operation:           "false" => "false"
          storage_image_reference.#:               "1" => "1"
          storage_image_reference.0.offer:         "UbuntuServer" => "UbuntuServer"
          storage_image_reference.0.publisher:     "Canonical" => "Canonical"
          storage_image_reference.0.sku:           "16.04.0-LTS" => "16.04.0-LTS"
          storage_image_reference.0.version:       "latest" => "latest"
          vm_size:                                 "STANDARD_A1" => "Standard_A1" (forces new resource)
        
        STATE:
        
        azurerm_batch_account.test:
          ID = /subscriptions/SUB_ID/resourceGroups/testaccbatch8903972532148945948/providers/Microsoft.Batch/batchAccounts/testaccbatchc3tm
          provider = provider.azurerm
          location = northeurope
          name = testaccbatchc3tm
          pool_allocation_mode = BatchService
          resource_group_name = testaccbatch8903972532148945948
          tags.% = 0
       
Dependencies:
            azurerm_resource_group.test
        azurerm_batch_pool.test:
          ID = /subscriptions/SUB_ID/resourceGroups/testaccbatch8903972532148945948/providers/Microsoft.Batch/batchAccounts/testaccbatchc3tm/pools/testaccpoolc3tm
          provider = provider.azurerm
          account_name = testaccbatchc3tm
          auto_scale.# = 0
          fixed_scale.# = 1
          fixed_scale.0.resize_timeout = PT15M
          fixed_scale.0.target_dedicated_nodes = 1
          fixed_scale.0.target_low_priority_nodes = 0
          name = testaccpoolc3tm
          node_agent_sku_id = batch.node.ubuntu 16.04
          resource_group_name = testaccbatch8903972532148945948
          stop_pending_resize_operation = false
          storage_image_reference.# = 1
          storage_image_reference.0.id = 
          storage_image_reference.0.offer = UbuntuServer
          storage_image_reference.0.publisher = Canonical
          storage_image_reference.0.sku = 16.04.0-LTS
          storage_image_reference.0.version = latest
          vm_size = STANDARD_A1
        
          Dependencies:
              azurerm_batch_account.test
            azurerm_resource_group.test
        azurerm_resource_group.test:
          ID = /subscriptions/SUB_ID/resourceGroups/testaccbatch8903972532148945948
          provider = provider.azurerm
          location = northeurope
          name = testaccbatch8903972532148945948
          tags.% = 0
FAIL

I am not sure of what happens exactly, if you have any clue that would be really helpful. Thanks!

@ghost ghost removed the waiting-response label Dec 20, 2018
@katbyte
Copy link
Collaborator

katbyte commented Dec 21, 2018

@jcorioland,

It appears to be a casing issue with vm_size being returned in all caps from the API? causing it to want to re-create the resource. Looks like that property is going to have to be case insensitive (and a bug should probably be opened with Azure as that seems like an error)

@jcorioland
Copy link
Contributor Author

jcorioland commented Dec 21, 2018

@katbyte thanks a lot, making the vmSize case insensitive solved the issue. All tests pass now! As you've suggested, I've opened an issue on the rest api specs repo to clarify this.
I think that I've fixed all the issues that you and @tombuildsstuff raised out during your reviews.
LMK if I need to do other changes.
Thanks

@jcorioland jcorioland changed the title [WIP] Support for Azure Batch - Pool Support for Azure Batch - Pool Dec 21, 2018
@tombuildsstuff
Copy link
Member

Data Source test passes:

screenshot 2018-12-23 at 15 15 48

Copy link
Collaborator

@katbyte katbyte left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hi @jcorioland,

I've tried running the tests again and gotten this error:

------- Stdout: -------
=== RUN   TestAccAzureRMBatchPool_autoScale_complete
=== PAUSE TestAccAzureRMBatchPool_autoScale_complete
=== CONT  TestAccAzureRMBatchPool_autoScale_complete
--- FAIL: TestAccAzureRMBatchPool_autoScale_complete (853.77s)
	testing.go:538: Step 0 error: After applying this step, the plan was not empty:
		
		DIFF:
		
		UPDATE: azurerm_batch_pool.test
		  auto_scale.0.formula: "startingNumberOfVMs = 1;\n      maxNumberofVMs = 25;\n      pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);\n      pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));\n      $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);" => "      startingNumberOfVMs = 1;\n      maxNumberofVMs = 25;\n      pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);\n      pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));\n      $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);\n"

FAIL

The difference:

      "startingNumberOfVMs = 1;\n      maxNumberofVMs = 25;\n      pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);\n      pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));\n      $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);" 
"      startingNumberOfVMs = 1;\n      maxNumberofVMs = 25;\n      pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);\n      pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));\n      $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);\n"

It seems the API is trimming the value and adding a newline to the end, might best to add a suppress diff function to this property. Also i noticed a bunch of other properties don't have any validation, it would be great to add some in.

Type: schema.TypeInt,
Optional: true,
Default: 1,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get some validation here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

"target_low_priority_nodes": {
Type: schema.TypeInt,
Optional: true,
Default: 0,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get some validation here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

"id": {
Type: schema.TypeString,
Optional: true,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we validate the ID: azure.ValidateResourceID

Type: schema.TypeString,
Required: true,
ForceNew: true,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get at least a validate.NoEmptyStrings here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

Type: schema.TypeString,
Required: true,
ForceNew: true,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get at least a validate.NoEmptyStrings here?

Type: schema.TypeString,
Required: true,
ForceNew: true,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get at least a validate.NoEmptyStrings here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

Required: true,
ForceNew: true,
DiffSuppressFunc: suppress.CaseDifference,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get at least a validate.NoEmptyStrings here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get at least a validate.NoEmptyStrings here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

"command_line": {
Type: schema.TypeString,
Required: true,
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we get at least a validate.NoEmptyStrings here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.


"user_identity": {
Type: schema.TypeList,
Required: true,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this we required when all the sub properties are optional?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was not sure for this one: user identity is mandatory, but you should specify either a user name or an auto identity. This is why I put the user_identity block mandatory but the two properties inside optional. What the best way to handle that? Adding some extra validation to the user_identity block to check that at least one type of identity has been specified?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If one of those values is required i would add an additional check & document it in the create/update functions for now.

@jcorioland
Copy link
Contributor Author

Hi @katbyte @tombuildsstuff - Happy New Year!
Thanks for your reviews.

I've added some validations, except for the user_identity, not sure on the best way to handle that case? (cf. my comment).
I don't have any issue with the acceptance test on autoscale, but I've added a suppress func to trim the string, as you've suggested.

Thank you

@katbyte
Copy link
Collaborator

katbyte commented Jan 8, 2019

Happy new year @jcorioland! Thanks for the commits.

If one of those values is required i would add a check for it into the create/update functions. A CutomizeDiff would be better to check during the plan but it doesn't work with interpolated values at the moment.

@jcorioland
Copy link
Contributor Author

@katbyte thanks! I've just added validation for user identity. Should be good now.

@ghost ghost removed the waiting-response label Jan 8, 2019
Copy link
Collaborator

@katbyte katbyte left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @jcorioland! LGTM now 🙂

@katbyte katbyte added this to the 1.21.0 milestone Jan 9, 2019
@katbyte katbyte merged commit e5c0e2e into hashicorp:master Jan 9, 2019
katbyte added a commit that referenced this pull request Jan 9, 2019
@ghost
Copy link

ghost commented Mar 5, 2019

I'm going to lock this issue because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active issues.

If you feel this issue should be reopened, we encourage creating a new issue linking back to this one for added context. If you feel I made an error 🤖 🙉 , please reach out to my human friends 👉 hashibot-feedback@hashicorp.com. Thanks!

@hashicorp hashicorp locked and limited conversation to collaborators Mar 5, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants