Bug fixes for GCP modules (as of 2019-01-22T12:43:52-08:00) (#51245)

This commit is contained in:
Alex Stephen 2019-01-23 13:45:40 -08:00
parent a81d110422
commit 6c246c99d6
24 changed files with 660 additions and 869 deletions

View file

@ -18,15 +18,14 @@
# ----------------------------------------------------------------------------
from __future__ import absolute_import, division, print_function
__metaclass__ = type
################################################################################
# Documentation
################################################################################
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ["preview"],
'supported_by': 'community'}
ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ["preview"], 'supported_by': 'community'}
DOCUMENTATION = '''
---
@ -891,70 +890,60 @@ def main():
argument_spec=dict(
state=dict(default='present', choices=['present', 'absent'], type='str'),
can_ip_forward=dict(type='bool'),
disks=dict(type='list', elements='dict', options=dict(
auto_delete=dict(type='bool'),
boot=dict(type='bool'),
device_name=dict(type='str'),
disk_encryption_key=dict(type='dict', options=dict(
raw_key=dict(type='str'),
rsa_encrypted_key=dict(type='str'),
sha256=dict(type='str')
)),
index=dict(type='int'),
initialize_params=dict(type='dict', options=dict(
disk_name=dict(type='str'),
disk_size_gb=dict(type='int'),
disk_type=dict(type='str'),
source_image=dict(type='str'),
source_image_encryption_key=dict(type='dict', options=dict(
raw_key=dict(type='str'),
sha256=dict(type='str')
))
)),
interface=dict(type='str', choices=['SCSI', 'NVME']),
mode=dict(type='str', choices=['READ_WRITE', 'READ_ONLY']),
source=dict(),
type=dict(type='str', choices=['SCRATCH', 'PERSISTENT'])
)),
guest_accelerators=dict(type='list', elements='dict', options=dict(
accelerator_count=dict(type='int'),
accelerator_type=dict(type='str')
)),
disks=dict(
type='list',
elements='dict',
options=dict(
auto_delete=dict(type='bool'),
boot=dict(type='bool'),
device_name=dict(type='str'),
disk_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'), rsa_encrypted_key=dict(type='str'), sha256=dict(type='str'))),
index=dict(type='int'),
initialize_params=dict(
type='dict',
options=dict(
disk_name=dict(type='str'),
disk_size_gb=dict(type='int'),
disk_type=dict(type='str'),
source_image=dict(type='str'),
source_image_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'), sha256=dict(type='str'))),
),
),
interface=dict(type='str', choices=['SCSI', 'NVME']),
mode=dict(type='str', choices=['READ_WRITE', 'READ_ONLY']),
source=dict(),
type=dict(type='str', choices=['SCRATCH', 'PERSISTENT']),
),
),
guest_accelerators=dict(type='list', elements='dict', options=dict(accelerator_count=dict(type='int'), accelerator_type=dict(type='str'))),
label_fingerprint=dict(type='str'),
metadata=dict(type='dict'),
machine_type=dict(type='str'),
min_cpu_platform=dict(type='str'),
name=dict(type='str'),
network_interfaces=dict(type='list', elements='dict', options=dict(
access_configs=dict(type='list', elements='dict', options=dict(
name=dict(required=True, type='str'),
nat_ip=dict(),
type=dict(required=True, type='str', choices=['ONE_TO_ONE_NAT'])
)),
alias_ip_ranges=dict(type='list', elements='dict', options=dict(
ip_cidr_range=dict(type='str'),
subnetwork_range_name=dict(type='str')
)),
name=dict(type='str'),
network=dict(),
network_ip=dict(type='str'),
subnetwork=dict()
)),
scheduling=dict(type='dict', options=dict(
automatic_restart=dict(type='bool'),
on_host_maintenance=dict(type='str'),
preemptible=dict(type='bool')
)),
service_accounts=dict(type='list', elements='dict', options=dict(
email=dict(type='str'),
scopes=dict(type='list', elements='str')
)),
network_interfaces=dict(
type='list',
elements='dict',
options=dict(
access_configs=dict(
type='list',
elements='dict',
options=dict(name=dict(required=True, type='str'), nat_ip=dict(), type=dict(required=True, type='str', choices=['ONE_TO_ONE_NAT'])),
),
alias_ip_ranges=dict(type='list', elements='dict', options=dict(ip_cidr_range=dict(type='str'), subnetwork_range_name=dict(type='str'))),
name=dict(type='str'),
network=dict(),
network_ip=dict(type='str'),
subnetwork=dict(),
),
),
scheduling=dict(
type='dict', options=dict(automatic_restart=dict(type='bool'), on_host_maintenance=dict(type='str'), preemptible=dict(type='bool'))
),
service_accounts=dict(type='list', elements='dict', options=dict(email=dict(type='str'), scopes=dict(type='list', elements='str'))),
status=dict(type='str', choices=['PROVISIONING', 'STAGING', 'RUNNING', 'STOPPING', 'SUSPENDING', 'SUSPENDED', 'TERMINATED']),
tags=dict(type='dict', options=dict(
fingerprint=dict(type='str'),
items=dict(type='list', elements='str')
)),
zone=dict(required=True, type='str')
tags=dict(type='dict', options=dict(fingerprint=dict(type='str'), items=dict(type='list', elements='str'))),
zone=dict(required=True, type='str'),
)
)
@ -1000,8 +989,7 @@ def create(module, link, kind):
def update(module, link, kind, fetch):
update_fields(module, resource_to_request(module),
response_to_hash(module, fetch))
update_fields(module, resource_to_request(module), response_to_hash(module, fetch))
return fetch_resource(module, self_link(module), kind)
@ -1013,13 +1001,8 @@ def update_fields(module, request, response):
def machine_type_update(module, request, response):
auth = GcpSession(module, 'compute')
auth.post(
''.join([
"https://www.googleapis.com/compute/v1/",
"projects/{project}/zones/{zone}/instances/{name}/setMachineType"
]).format(**module.params),
{
u'machineType': machine_type_selflink(module.params.get('machine_type'), module.params)
}
''.join(["https://www.googleapis.com/compute/v1/", "projects/{project}/zones/{zone}/instances/{name}/setMachineType"]).format(**module.params),
{u'machineType': machine_type_selflink(module.params.get('machine_type'), module.params)},
)
@ -1043,7 +1026,7 @@ def resource_to_request(module):
u'scheduling': InstanceScheduling(module.params.get('scheduling', {}), module).to_request(),
u'serviceAccounts': InstanceServiceaccountsArray(module.params.get('service_accounts', []), module).to_request(),
u'status': module.params.get('status'),
u'tags': InstanceTags(module.params.get('tags', {}), module).to_request()
u'tags': InstanceTags(module.params.get('tags', {}), module).to_request(),
}
request = encode_request(request, module)
return_vals = {}
@ -1079,8 +1062,8 @@ def return_if_object(module, response, kind, allow_not_found=False):
try:
module.raise_for_status(response)
result = response.json()
except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst:
module.fail_json(msg="Invalid JSON response with error: %s" % inst)
except getattr(json.decoder, 'JSONDecodeError', ValueError):
module.fail_json(msg="Invalid JSON response with error: %s" % response.text)
result = decode_response(result, module)
@ -1129,7 +1112,7 @@ def response_to_hash(module, response):
u'serviceAccounts': InstanceServiceaccountsArray(response.get(u'serviceAccounts', []), module).from_response(),
u'status': response.get(u'status'),
u'statusMessage': response.get(u'statusMessage'),
u'tags': InstanceTags(response.get(u'tags', {}), module).from_response()
u'tags': InstanceTags(response.get(u'tags', {}), module).from_response(),
}
@ -1173,7 +1156,7 @@ def wait_for_completion(status, op_result, module):
op_id = navigate_hash(op_result, ['name'])
op_uri = async_op_url(module, {'op_id': op_id})
while status != 'DONE':
raise_if_errors(op_result, ['error', 'errors'], 'message')
raise_if_errors(op_result, ['error', 'errors'], module)
time.sleep(1.0)
op_result = fetch_resource(module, op_uri, 'compute#operation')
status = navigate_hash(op_result, ['status'])
@ -1218,13 +1201,8 @@ def metadata_encoder(metadata):
metadata_new = []
for key in metadata:
value = metadata[key]
metadata_new.append({
"key": key,
"value": value
})
return {
'items': metadata_new
}
metadata_new.append({"key": key, "value": value})
return {'items': metadata_new}
# Map metadata.items[]{key:,value:} => metadata[key]=value
@ -1290,32 +1268,36 @@ class InstanceDisksArray(object):
return items
def _request_for_item(self, item):
return remove_nones_from_dict({
u'autoDelete': item.get('auto_delete'),
u'boot': item.get('boot'),
u'deviceName': item.get('device_name'),
u'diskEncryptionKey': InstanceDiskencryptionkey(item.get('disk_encryption_key', {}), self.module).to_request(),
u'index': item.get('index'),
u'initializeParams': InstanceInitializeparams(item.get('initialize_params', {}), self.module).to_request(),
u'interface': item.get('interface'),
u'mode': item.get('mode'),
u'source': replace_resource_dict(item.get(u'source', {}), 'selfLink'),
u'type': item.get('type')
})
return remove_nones_from_dict(
{
u'autoDelete': item.get('auto_delete'),
u'boot': item.get('boot'),
u'deviceName': item.get('device_name'),
u'diskEncryptionKey': InstanceDiskencryptionkey(item.get('disk_encryption_key', {}), self.module).to_request(),
u'index': item.get('index'),
u'initializeParams': InstanceInitializeparams(item.get('initialize_params', {}), self.module).to_request(),
u'interface': item.get('interface'),
u'mode': item.get('mode'),
u'source': replace_resource_dict(item.get(u'source', {}), 'selfLink'),
u'type': item.get('type'),
}
)
def _response_from_item(self, item):
return remove_nones_from_dict({
u'autoDelete': item.get(u'autoDelete'),
u'boot': item.get(u'boot'),
u'deviceName': item.get(u'deviceName'),
u'diskEncryptionKey': InstanceDiskencryptionkey(item.get(u'diskEncryptionKey', {}), self.module).from_response(),
u'index': item.get(u'index'),
u'initializeParams': InstanceInitializeparams(self.module.params.get('initialize_params', {}), self.module).to_request(),
u'interface': item.get(u'interface'),
u'mode': item.get(u'mode'),
u'source': item.get(u'source'),
u'type': item.get(u'type')
})
return remove_nones_from_dict(
{
u'autoDelete': item.get(u'autoDelete'),
u'boot': item.get(u'boot'),
u'deviceName': item.get(u'deviceName'),
u'diskEncryptionKey': InstanceDiskencryptionkey(item.get(u'diskEncryptionKey', {}), self.module).from_response(),
u'index': item.get(u'index'),
u'initializeParams': InstanceInitializeparams(self.module.params.get('initialize_params', {}), self.module).to_request(),
u'interface': item.get(u'interface'),
u'mode': item.get(u'mode'),
u'source': item.get(u'source'),
u'type': item.get(u'type'),
}
)
class InstanceDiskencryptionkey(object):
@ -1327,18 +1309,14 @@ class InstanceDiskencryptionkey(object):
self.request = {}
def to_request(self):
return remove_nones_from_dict({
u'rawKey': self.request.get('raw_key'),
u'rsaEncryptedKey': self.request.get('rsa_encrypted_key'),
u'sha256': self.request.get('sha256')
})
return remove_nones_from_dict(
{u'rawKey': self.request.get('raw_key'), u'rsaEncryptedKey': self.request.get('rsa_encrypted_key'), u'sha256': self.request.get('sha256')}
)
def from_response(self):
return remove_nones_from_dict({
u'rawKey': self.request.get(u'rawKey'),
u'rsaEncryptedKey': self.request.get(u'rsaEncryptedKey'),
u'sha256': self.request.get(u'sha256')
})
return remove_nones_from_dict(
{u'rawKey': self.request.get(u'rawKey'), u'rsaEncryptedKey': self.request.get(u'rsaEncryptedKey'), u'sha256': self.request.get(u'sha256')}
)
class InstanceInitializeparams(object):
@ -1350,22 +1328,26 @@ class InstanceInitializeparams(object):
self.request = {}
def to_request(self):
return remove_nones_from_dict({
u'diskName': self.request.get('disk_name'),
u'diskSizeGb': self.request.get('disk_size_gb'),
u'diskType': disk_type_selflink(self.request.get('disk_type'), self.module.params),
u'sourceImage': self.request.get('source_image'),
u'sourceImageEncryptionKey': InstanceSourceimageencryptionkey(self.request.get('source_image_encryption_key', {}), self.module).to_request()
})
return remove_nones_from_dict(
{
u'diskName': self.request.get('disk_name'),
u'diskSizeGb': self.request.get('disk_size_gb'),
u'diskType': disk_type_selflink(self.request.get('disk_type'), self.module.params),
u'sourceImage': self.request.get('source_image'),
u'sourceImageEncryptionKey': InstanceSourceimageencryptionkey(self.request.get('source_image_encryption_key', {}), self.module).to_request(),
}
)
def from_response(self):
return remove_nones_from_dict({
u'diskName': self.request.get(u'diskName'),
u'diskSizeGb': self.request.get(u'diskSizeGb'),
u'diskType': self.request.get(u'diskType'),
u'sourceImage': self.request.get(u'sourceImage'),
u'sourceImageEncryptionKey': InstanceSourceimageencryptionkey(self.request.get(u'sourceImageEncryptionKey', {}), self.module).from_response()
})
return remove_nones_from_dict(
{
u'diskName': self.request.get(u'diskName'),
u'diskSizeGb': self.request.get(u'diskSizeGb'),
u'diskType': self.request.get(u'diskType'),
u'sourceImage': self.request.get(u'sourceImage'),
u'sourceImageEncryptionKey': InstanceSourceimageencryptionkey(self.request.get(u'sourceImageEncryptionKey', {}), self.module).from_response(),
}
)
class InstanceSourceimageencryptionkey(object):
@ -1377,16 +1359,10 @@ class InstanceSourceimageencryptionkey(object):
self.request = {}
def to_request(self):
return remove_nones_from_dict({
u'rawKey': self.request.get('raw_key'),
u'sha256': self.request.get('sha256')
})
return remove_nones_from_dict({u'rawKey': self.request.get('raw_key'), u'sha256': self.request.get('sha256')})
def from_response(self):
return remove_nones_from_dict({
u'rawKey': self.request.get(u'rawKey'),
u'sha256': self.request.get(u'sha256')
})
return remove_nones_from_dict({u'rawKey': self.request.get(u'rawKey'), u'sha256': self.request.get(u'sha256')})
class InstanceGuestacceleratorsArray(object):
@ -1410,16 +1386,10 @@ class InstanceGuestacceleratorsArray(object):
return items
def _request_for_item(self, item):
return remove_nones_from_dict({
u'acceleratorCount': item.get('accelerator_count'),
u'acceleratorType': item.get('accelerator_type')
})
return remove_nones_from_dict({u'acceleratorCount': item.get('accelerator_count'), u'acceleratorType': item.get('accelerator_type')})
def _response_from_item(self, item):
return remove_nones_from_dict({
u'acceleratorCount': item.get(u'acceleratorCount'),
u'acceleratorType': item.get(u'acceleratorType')
})
return remove_nones_from_dict({u'acceleratorCount': item.get(u'acceleratorCount'), u'acceleratorType': item.get(u'acceleratorType')})
class InstanceNetworkinterfacesArray(object):
@ -1443,24 +1413,28 @@ class InstanceNetworkinterfacesArray(object):
return items
def _request_for_item(self, item):
return remove_nones_from_dict({
u'accessConfigs': InstanceAccessconfigsArray(item.get('access_configs', []), self.module).to_request(),
u'aliasIpRanges': InstanceAliasiprangesArray(item.get('alias_ip_ranges', []), self.module).to_request(),
u'name': item.get('name'),
u'network': replace_resource_dict(item.get(u'network', {}), 'selfLink'),
u'networkIP': item.get('network_ip'),
u'subnetwork': replace_resource_dict(item.get(u'subnetwork', {}), 'selfLink')
})
return remove_nones_from_dict(
{
u'accessConfigs': InstanceAccessconfigsArray(item.get('access_configs', []), self.module).to_request(),
u'aliasIpRanges': InstanceAliasiprangesArray(item.get('alias_ip_ranges', []), self.module).to_request(),
u'name': item.get('name'),
u'network': replace_resource_dict(item.get(u'network', {}), 'selfLink'),
u'networkIP': item.get('network_ip'),
u'subnetwork': replace_resource_dict(item.get(u'subnetwork', {}), 'selfLink'),
}
)
def _response_from_item(self, item):
return remove_nones_from_dict({
u'accessConfigs': InstanceAccessconfigsArray(item.get(u'accessConfigs', []), self.module).from_response(),
u'aliasIpRanges': InstanceAliasiprangesArray(item.get(u'aliasIpRanges', []), self.module).from_response(),
u'name': item.get(u'name'),
u'network': item.get(u'network'),
u'networkIP': item.get(u'networkIP'),
u'subnetwork': item.get(u'subnetwork')
})
return remove_nones_from_dict(
{
u'accessConfigs': InstanceAccessconfigsArray(item.get(u'accessConfigs', []), self.module).from_response(),
u'aliasIpRanges': InstanceAliasiprangesArray(item.get(u'aliasIpRanges', []), self.module).from_response(),
u'name': item.get(u'name'),
u'network': item.get(u'network'),
u'networkIP': item.get(u'networkIP'),
u'subnetwork': item.get(u'subnetwork'),
}
)
class InstanceAccessconfigsArray(object):
@ -1484,18 +1458,12 @@ class InstanceAccessconfigsArray(object):
return items
def _request_for_item(self, item):
return remove_nones_from_dict({
u'name': item.get('name'),
u'natIP': replace_resource_dict(item.get(u'nat_ip', {}), 'address'),
u'type': item.get('type')
})
return remove_nones_from_dict(
{u'name': item.get('name'), u'natIP': replace_resource_dict(item.get(u'nat_ip', {}), 'address'), u'type': item.get('type')}
)
def _response_from_item(self, item):
return remove_nones_from_dict({
u'name': item.get(u'name'),
u'natIP': item.get(u'natIP'),
u'type': item.get(u'type')
})
return remove_nones_from_dict({u'name': item.get(u'name'), u'natIP': item.get(u'natIP'), u'type': item.get(u'type')})
class InstanceAliasiprangesArray(object):
@ -1519,16 +1487,10 @@ class InstanceAliasiprangesArray(object):
return items
def _request_for_item(self, item):
return remove_nones_from_dict({
u'ipCidrRange': item.get('ip_cidr_range'),
u'subnetworkRangeName': item.get('subnetwork_range_name')
})
return remove_nones_from_dict({u'ipCidrRange': item.get('ip_cidr_range'), u'subnetworkRangeName': item.get('subnetwork_range_name')})
def _response_from_item(self, item):
return remove_nones_from_dict({
u'ipCidrRange': item.get(u'ipCidrRange'),
u'subnetworkRangeName': item.get(u'subnetworkRangeName')
})
return remove_nones_from_dict({u'ipCidrRange': item.get(u'ipCidrRange'), u'subnetworkRangeName': item.get(u'subnetworkRangeName')})
class InstanceScheduling(object):
@ -1540,18 +1502,22 @@ class InstanceScheduling(object):
self.request = {}
def to_request(self):
return remove_nones_from_dict({
u'automaticRestart': self.request.get('automatic_restart'),
u'onHostMaintenance': self.request.get('on_host_maintenance'),
u'preemptible': self.request.get('preemptible')
})
return remove_nones_from_dict(
{
u'automaticRestart': self.request.get('automatic_restart'),
u'onHostMaintenance': self.request.get('on_host_maintenance'),
u'preemptible': self.request.get('preemptible'),
}
)
def from_response(self):
return remove_nones_from_dict({
u'automaticRestart': self.request.get(u'automaticRestart'),
u'onHostMaintenance': self.request.get(u'onHostMaintenance'),
u'preemptible': self.request.get(u'preemptible')
})
return remove_nones_from_dict(
{
u'automaticRestart': self.request.get(u'automaticRestart'),
u'onHostMaintenance': self.request.get(u'onHostMaintenance'),
u'preemptible': self.request.get(u'preemptible'),
}
)
class InstanceServiceaccountsArray(object):
@ -1575,16 +1541,10 @@ class InstanceServiceaccountsArray(object):
return items
def _request_for_item(self, item):
return remove_nones_from_dict({
u'email': item.get('email'),
u'scopes': item.get('scopes')
})
return remove_nones_from_dict({u'email': item.get('email'), u'scopes': item.get('scopes')})
def _response_from_item(self, item):
return remove_nones_from_dict({
u'email': item.get(u'email'),
u'scopes': item.get(u'scopes')
})
return remove_nones_from_dict({u'email': item.get(u'email'), u'scopes': item.get(u'scopes')})
class InstanceTags(object):
@ -1596,16 +1556,10 @@ class InstanceTags(object):
self.request = {}
def to_request(self):
return remove_nones_from_dict({
u'fingerprint': self.request.get('fingerprint'),
u'items': self.request.get('items')
})
return remove_nones_from_dict({u'fingerprint': self.request.get('fingerprint'), u'items': self.request.get('items')})
def from_response(self):
return remove_nones_from_dict({
u'fingerprint': self.request.get(u'fingerprint'),
u'items': self.request.get(u'items')
})
return remove_nones_from_dict({u'fingerprint': self.request.get(u'fingerprint'), u'items': self.request.get(u'items')})
if __name__ == '__main__':