@ -242,17 +242,185 @@ facts:
from ansible . module_utils . basic import AnsibleModule
from ansible . module_utils . basic import AnsibleModule
from ansible . module_utils . basic import env_fallback
from ansible . module_utils . basic import env_fallback
import paramiko
from ansible . module_utils . decort_utils import *
from ansible . module_utils . decort_utils import *
class decort_vins ( DecortController ) :
def __init__ ( self , arg_amodule ) :
super ( decort_vins , self ) . __init__ ( arg_amodule )
def decort_vins_package_facts ( arg_vins_facts , arg_check_mode = False ) :
vins_id = 0
vins_level = " " # "ID" if specified by ID, "RG" - at resource group, "ACC" - at account level
vins_facts = None # will hold ViNS facts
validated_rg_id = 0
rg_facts = None # will hold RG facts
validated_acc_id = 0
acc_facts = None # will hold Account facts
if arg_amodule . params [ ' vins_id ' ] :
# expect existing ViNS with the specified ID
# This call to vins_find will abort the module if no ViNS with such ID is present
self . vins_id , self . vins_facts = self . vins_find ( arg_amodule . params [ ' vins_id ' ] )
if not vins_id :
self . result [ ' failed ' ] = True
self . result [ ' msg ' ] = " Specified ViNS ID {} not found. " . format ( arg_amodule . params [ ' vins_id ' ] )
self . fail_json ( * * self . result )
vins_level = " ID "
validated_acc_id = vins_facts [ ' accountId ' ]
validated_rg_id = vins_facts [ ' rgId ' ]
elif arg_amodule . params [ ' rg_id ' ] :
# expect ViNS @ RG level in the RG with specified ID
vins_level = " RG "
# This call to rg_find will abort the module if no RG with such ID is present
validated_rg_id , rg_facts = self . rg_find ( 0 , # account ID set to 0 as we search for RG by RG ID
arg_amodule . params [ ' rg_id ' ] , arg_rg_name = " " )
# This call to vins_find may return vins_id=0 if no ViNS found
self . vins_id , self . vins_facts = self . vins_find ( vins_id = 0 , vins_name = arg_amodule . params [ ' vins_name ' ] ,
account_id = 0 ,
rg_id = arg_amodule . params [ ' rg_id ' ] ,
rg_facts = rg_facts ,
check_state = False )
# TODO: add checks and setup ViNS presence flags accordingly
pass
elif arg_amodule . params [ ' account_id ' ] or arg_amodule . params [ ' account_name ' ] != " " :
# Specified account must be present and accessible by the user, otherwise abort the module
validated_acc_id , acc_facts = self . account_find ( arg_amodule . params [ ' account_name ' ] , arg_amodule . params [ ' account_id ' ] )
if not validated_acc_id :
self . result [ ' failed ' ] = True
self . result [ ' msg ' ] = ( " Current user does not have access to the requested account "
" or non-existent account specified. " )
self . fail_json ( * * self . result )
if arg_amodule . params [ ' rg_name ' ] != " " : # at this point we know that rg_id=0
# expect ViNS @ RG level in the RG with specified name under specified account
# RG with the specified name must be present under the account, otherwise abort the module
validated_rg_id , rg_facts = self . rg_find ( validated_acc_id , 0 , arg_amodule . params [ ' rg_name ' ] )
if ( not validated_rg_id or
rg_facts [ ' status ' ] in [ " DESTROYING " , " DESTROYED " , " DELETING " , " DELETED " , " DISABLING " , " ENABLING " ] ) :
self . result [ ' failed ' ] = True
self . result [ ' msg ' ] = " RG name ' {} ' not found or has invalid state. " . format ( arg_amodule . params [ ' rg_name ' ] )
self . fail_json ( * * self . result )
# This call to vins_find may return vins_id=0 if no ViNS with this name found under specified RG
self . vins_id , self . vins_facts = self . vins_find ( vins_id = 0 , vins_name = arg_amodule . params [ ' vins_name ' ] ,
account_id = 0 , # set to 0, as we are looking for ViNS under RG
rg_id = validated_rg_id ,
rg_facts = rg_facts ,
check_state = False )
vins_level = " RG "
# TODO: add checks and setup ViNS presence flags accordingly
else : # At this point we know for sure that rg_name="" and rg_id=0
# So we expect ViNS @ account level
# This call to vins_find may return vins_id=0 if no ViNS found
self . vins_id , self . vins_facts = self . vins_find ( vins_id = 0 , vins_name = arg_amodule . params [ ' vins_name ' ] ,
account_id = validated_acc_id ,
rg_id = 0 ,
rg_facts = rg_facts ,
check_state = False )
vins_level = " ACC "
# TODO: add checks and setup ViNS presence flags accordingly
else :
# this is "invalid arguments combination" sink
# if we end up here, it means that module was invoked with vins_id=0 and rg_id=0
self . result [ ' failed ' ] = True
if arg_amodule . params [ ' account_id ' ] == 0 and arg_amodule . params [ ' account_name ' ] == " " :
self . result [ ' msg ' ] = " Cannot find ViNS by name when account name is empty and account ID is 0. "
if arg_amodule . params [ ' rg_name ' ] == " " :
# rg_name without account specified
self . result [ ' msg ' ] = " Cannot find ViNS by name when RG name is empty and RG ID is 0. "
self . fail_json ( * * self . result )
return
self . rg_id = validated_rg_id
self . acc_id = validated_acc_id
return
def create ( self ) :
self . vins_id = self . vins_provision ( self . amodule . params [ ' vins_name ' ] ,
self . acc_id , self . rg_id ,
self . amodule . params [ ' ipcidr ' ] ,
self . amodule . params [ ' ext_net_id ' ] , self . amodule . params [ ' ext_ip_addr ' ] ,
self . amodule . params [ ' annotation ' ] )
if self . amodule . params [ ' mgmtaddr ' ] or self . amodule . params [ ' connect_to ' ] :
_ , self . vins_facts = self . vins_find ( self . vins_id )
if self . amodule . params [ ' connect_to ' ] :
self . vins_update_ifaces ( self . vins_facts , self . amodule . params [ ' connect_to ' ] , )
if self . amodule . params [ ' mgmtaddr ' ] :
self . vins_update_mgmt ( self . vins_facts , self . amodule . params [ ' mgmtaddr ' ] )
return
def action ( self , d_state = ' ' , restore = False ) :
if restore == True :
self . vins_restore ( arg_vins_id = self . vins_id )
self . vins_state ( self . vins_facts , ' enabled ' )
self . vins_facts [ ' status ' ] = " ENABLED "
self . vins_facts [ ' VNFDev ' ] [ ' techStatus ' ] = " STARTED "
self . vins_update_extnet ( self . vins_facts ,
self . amodule . params [ ' ext_net_id ' ] ,
self . amodule . params [ ' ext_ip_addr ' ] ,
)
if d_state == ' enabled ' and self . vins_facts [ ' status ' ] == " DISABLED " :
self . vins_state ( self . vins_facts , d_state )
self . vins_facts [ ' status ' ] = " ENABLED "
self . vins_facts [ ' VNFDev ' ] [ ' techStatus ' ] = " STARTED "
d_state = ' '
if self . vins_facts [ ' status ' ] == " ENABLED " and self . vins_facts [ ' VNFDev ' ] [ ' techStatus ' ] == " STARTED " :
self . vins_update_ifaces ( self . vins_facts ,
self . amodule . params [ ' connect_to ' ] ,
)
if self . result [ ' changed ' ] :
_ , self . vins_facts = self . vins_find ( self . vins_id )
self . vins_update_mgmt ( self . vins_facts ,
self . amodule . params [ ' mgmtaddr ' ] ,
)
if d_state != ' ' :
self . vins_state ( self . vins_facts , d_state )
return
def delete ( self ) :
self . vins_delete ( self . vins_id , permanently = True )
self . vins_facts [ ' status ' ] = ' DESTROYED '
return
def nop ( self ) :
""" No operation (NOP) handler for ViNS management by decort_vins module.
This function is intended to be called from the main switch construct of the module
when current state - > desired state change logic does not require any changes to
the actual ViNS state .
"""
self . result [ ' failed ' ] = False
self . result [ ' changed ' ] = False
if self . vins_id :
self . result [ ' msg ' ] = ( " No state change required for ViNS ID {} because of its "
" current status ' {} ' . " ) . format ( self . vins_id , self . vins_facts [ ' status ' ] )
else :
self . result [ ' msg ' ] = ( " No state change to ' {} ' can be done for "
" non-existent ViNS instance. " ) . format ( self . amodule . params [ ' state ' ] )
return
def error ( self ) :
self . result [ ' failed ' ] = True
self . result [ ' changed ' ] = False
if self . vins_id :
self . result [ ' failed ' ] = True
self . result [ ' changed ' ] = False
self . result [ ' msg ' ] = ( " Invalid target state ' {} ' requested for ViNS ID {} in the "
" current status ' {} ' " ) . format ( self . vins_id ,
self . amodule . params [ ' state ' ] ,
self . vins_facts [ ' status ' ] )
else :
self . result [ ' failed ' ] = True
self . result [ ' changed ' ] = False
self . result [ ' msg ' ] = ( " Invalid target state ' {} ' requested for non-existent "
" ViNS name ' {} ' " ) . format ( self . amodule . params [ ' state ' ] ,
self . amodule . params [ ' vins_name ' ] )
return
def package_facts ( self , arg_check_mode = False ) :
""" Package a dictionary of ViNS facts according to the decort_vins module specification.
""" Package a dictionary of ViNS facts according to the decort_vins module specification.
This dictionary will be returned to the upstream Ansible engine at the completion of
This dictionary will be returned to the upstream Ansible engine at the completion of
the module run .
the module run .
@param arg_vins_facts : dictionary with viNS facts as returned by API call to . . . / vins / get
@param arg_check_mode : boolean that tells if this Ansible module is run in check mode
@param arg_check_mode : boolean that tells if this Ansible module is run in check mode
"""
"""
@ -265,21 +433,32 @@ def decort_vins_package_facts(arg_vins_facts, arg_check_mode=False):
# in check mode return immediately with the default values
# in check mode return immediately with the default values
return ret_dict
return ret_dict
if arg_ vins_facts is None :
if self . vins_facts is None :
# if void facts provided - change state value to ABSENT and return
# if void facts provided - change state value to ABSENT and return
ret_dict [ ' state ' ] = " ABSENT "
ret_dict [ ' state ' ] = " ABSENT "
return ret_dict
return ret_dict
ret_dict [ ' id ' ] = arg_vins_facts [ ' id ' ]
ret_dict [ ' id ' ] = self . vins_facts [ ' id ' ]
ret_dict [ ' name ' ] = arg_vins_facts [ ' name ' ]
ret_dict [ ' name ' ] = self . vins_facts [ ' name ' ]
ret_dict [ ' state ' ] = arg_vins_facts [ ' status ' ]
ret_dict [ ' state ' ] = self . vins_facts [ ' status ' ]
ret_dict [ ' account_id ' ] = arg_vins_facts [ ' accountId ' ]
ret_dict [ ' account_id ' ] = self . vins_facts [ ' accountId ' ]
ret_dict [ ' rg_id ' ] = arg_vins_facts [ ' rgId ' ]
ret_dict [ ' rg_id ' ] = self . vins_facts [ ' rgId ' ]
ret_dict [ ' int_net_addr ' ] = arg_vins_facts [ ' network ' ]
ret_dict [ ' int_net_addr ' ] = self . vins_facts [ ' network ' ]
ret_dict [ ' gid ' ] = arg_vins_facts [ ' gid ' ]
ret_dict [ ' gid ' ] = self . vins_facts [ ' gid ' ]
custom_interfaces = list ( filter ( lambda i : i [ ' type ' ] == " CUSTOM " , self . vins_facts [ ' VNFDev ' ] [ ' interfaces ' ] ) )
if arg_vins_facts [ ' vnfs ' ] . get ( ' GW ' ) :
if custom_interfaces :
gw_config = arg_vins_facts [ ' vnfs ' ] [ ' GW ' ] [ ' config ' ]
ret_dict [ ' custom_net_addr ' ] = [ ]
for runner in custom_interfaces :
ret_dict [ ' custom_net_addr ' ] . append ( runner [ ' ipAddress ' ] )
mgmt_interfaces = list ( filter ( lambda i : i [ ' listenSsh ' ] and i [ ' name ' ] != " ens9 " , self . vins_facts [ ' VNFDev ' ] [ ' interfaces ' ] ) )
if mgmt_interfaces :
ret_dict [ ' ssh_ipaddr ' ] = [ ]
for runner in mgmt_interfaces :
ret_dict [ ' ssh_ipaddr ' ] . append ( runner [ ' ipAddress ' ] )
ret_dict [ ' ssh_password ' ] = self . vins_facts [ ' VNFDev ' ] [ ' config ' ] [ ' mgmt ' ] [ ' password ' ]
ret_dict [ ' ssh_port ' ] = 9022
if self . vins_facts [ ' vnfs ' ] . get ( ' GW ' ) :
gw_config = self . vins_facts [ ' vnfs ' ] [ ' GW ' ] [ ' config ' ]
ret_dict [ ' ext_ip_addr ' ] = gw_config [ ' ext_net_ip ' ]
ret_dict [ ' ext_ip_addr ' ] = gw_config [ ' ext_net_ip ' ]
ret_dict [ ' ext_net_id ' ] = gw_config [ ' ext_net_id ' ]
ret_dict [ ' ext_net_id ' ] = gw_config [ ' ext_net_id ' ]
else :
else :
@ -293,8 +472,8 @@ def decort_vins_package_facts(arg_vins_facts, arg_check_mode=False):
return ret_dict
return ret_dict
@staticmethod
def decort_vins _parameters( ) :
def build _parameters( ) :
""" Build and return a dictionary of parameters expected by decort_vins module in a form accepted
""" Build and return a dictionary of parameters expected by decort_vins module in a form accepted
by AnsibleModule utility class . """
by AnsibleModule utility class . """
@ -317,7 +496,7 @@ def decort_vins_parameters():
ext_net_id = dict ( type = ' int ' , required = False , default = - 1 ) ,
ext_net_id = dict ( type = ' int ' , required = False , default = - 1 ) ,
ext_ip_addr = dict ( type = ' str ' , required = False , default = ' ' ) ,
ext_ip_addr = dict ( type = ' str ' , required = False , default = ' ' ) ,
ipcidr = dict ( type = ' str ' , required = False , default = ' ' ) ,
ipcidr = dict ( type = ' str ' , required = False , default = ' ' ) ,
mgmtaddr = dict ( type = ' str ' , required = False , default = ' ' ) ,
mgmtaddr = dict ( type = ' li st' , required = False , default = [ ] ) ,
custom_config = dict ( type = ' bool ' , required = False , default = False ) ,
custom_config = dict ( type = ' bool ' , required = False , default = False ) ,
config_save = dict ( type = ' bool ' , required = False , default = False ) ,
config_save = dict ( type = ' bool ' , required = False , default = False ) ,
connect_to = dict ( type = ' list ' , default = [ ] , required = False ) ,
connect_to = dict ( type = ' list ' , default = [ ] , required = False ) ,
@ -356,7 +535,7 @@ def decort_vins_parameters():
# 5) report result to Ansible
# 5) report result to Ansible
def main ( ) :
def main ( ) :
module_parameters = decort_vins _parameters( )
module_parameters = decort_vins . build _parameters( )
amodule = AnsibleModule ( argument_spec = module_parameters ,
amodule = AnsibleModule ( argument_spec = module_parameters ,
supports_check_mode = True ,
supports_check_mode = True ,
@ -371,84 +550,7 @@ def main():
] ,
] ,
)
)
decon = DecortController ( amodule )
decon = decort_vins ( amodule )
vins_id = 0
vins_level = " " # "ID" if specified by ID, "RG" - at resource group, "ACC" - at account level
vins_facts = None # will hold ViNS facts
validated_rg_id = 0
rg_facts = None # will hold RG facts
validated_acc_id = 0
acc_facts = None # will hold Account facts
if amodule . params [ ' vins_id ' ] :
# expect existing ViNS with the specified ID
# This call to vins_find will abort the module if no ViNS with such ID is present
vins_id , vins_facts = decon . vins_find ( amodule . params [ ' vins_id ' ] )
if not vins_id :
decon . result [ ' failed ' ] = True
decon . result [ ' msg ' ] = " Specified ViNS ID {} not found. " . format ( amodule . params [ ' vins_id ' ] )
decon . fail_json ( * * decon . result )
vins_level = " ID "
validated_acc_id = vins_facts [ ' accountId ' ]
validated_rg_id = vins_facts [ ' rgId ' ]
elif amodule . params [ ' rg_id ' ] :
# expect ViNS @ RG level in the RG with specified ID
vins_level = " RG "
# This call to rg_find will abort the module if no RG with such ID is present
validated_rg_id , rg_facts = decon . rg_find ( 0 , # account ID set to 0 as we search for RG by RG ID
amodule . params [ ' rg_id ' ] , arg_rg_name = " " )
# This call to vins_find may return vins_id=0 if no ViNS found
vins_id , vins_facts = decon . vins_find ( vins_id = 0 , vins_name = amodule . params [ ' vins_name ' ] ,
account_id = 0 ,
rg_id = amodule . params [ ' rg_id ' ] ,
check_state = False )
# TODO: add checks and setup ViNS presence flags accordingly
pass
elif amodule . params [ ' account_id ' ] or amodule . params [ ' account_name ' ] != " " :
# Specified account must be present and accessible by the user, otherwise abort the module
validated_acc_id , acc_facts = decon . account_find ( amodule . params [ ' account_name ' ] , amodule . params [ ' account_id ' ] )
if not validated_acc_id :
decon . result [ ' failed ' ] = True
decon . result [ ' msg ' ] = ( " Current user does not have access to the requested account "
" or non-existent account specified. " )
decon . fail_json ( * * decon . result )
if amodule . params [ ' rg_name ' ] != " " : # at this point we know that rg_id=0
# expect ViNS @ RG level in the RG with specified name under specified account
# RG with the specified name must be present under the account, otherwise abort the module
validated_rg_id , rg_facts = decon . rg_find ( validated_acc_id , 0 , amodule . params [ ' rg_name ' ] )
if ( not validated_rg_id or
rg_facts [ ' status ' ] in [ " DESTROYING " , " DESTROYED " , " DELETING " , " DELETED " , " DISABLING " , " ENABLING " ] ) :
decon . result [ ' failed ' ] = True
decon . result [ ' msg ' ] = " RG name ' {} ' not found or has invalid state. " . format ( amodule . params [ ' rg_name ' ] )
decon . fail_json ( * * decon . result )
# This call to vins_find may return vins_id=0 if no ViNS with this name found under specified RG
vins_id , vins_facts = decon . vins_find ( vins_id = 0 , vins_name = amodule . params [ ' vins_name ' ] ,
account_id = 0 , # set to 0, as we are looking for ViNS under RG
rg_id = validated_rg_id ,
check_state = False )
vins_level = " RG "
# TODO: add checks and setup ViNS presence flags accordingly
else : # At this point we know for sure that rg_name="" and rg_id=0
# So we expect ViNS @ account level
# This call to vins_find may return vins_id=0 if no ViNS found
vins_id , vins_facts = decon . vins_find ( vins_id = 0 , vins_name = amodule . params [ ' vins_name ' ] ,
account_id = validated_acc_id ,
rg_id = 0 ,
check_state = False )
vins_level = " ACC "
# TODO: add checks and setup ViNS presence flags accordingly
else :
# this is "invalid arguments combination" sink
# if we end up here, it means that module was invoked with vins_id=0 and rg_id=0
decon . result [ ' failed ' ] = True
if amodule . params [ ' account_id ' ] == 0 and amodule . params [ ' account_name ' ] == " " :
decon . result [ ' msg ' ] = " Cannot find ViNS by name when account name is empty and account ID is 0. "
if amodule . params [ ' rg_name ' ] == " " :
# rg_name without account specified
decon . result [ ' msg ' ] = " Cannot find ViNS by name when RG name is empty and RG ID is 0. "
decon . fail_json ( * * decon . result )
#
#
# Initial validation of module arguments is complete
# Initial validation of module arguments is complete
#
#
@ -465,127 +567,70 @@ def main():
# if cconfig_save is true, only config save without other updates
# if cconfig_save is true, only config save without other updates
vins_should_exist = False
vins_should_exist = False
if vins_id:
if decon. vins_id:
vins_should_exist = True
vins_should_exist = True
if vins_facts[ ' status ' ] in [ " MODELED " , " DISABLING " , " ENABLING " , " DELETING " , " DESTROYING " ] :
if decon. vins_facts[ ' status ' ] in [ " MODELED " , " DISABLING " , " ENABLING " , " DELETING " , " DESTROYING " ] :
# error: nothing can be done to existing ViNS in the listed statii regardless of
# error: nothing can be done to existing ViNS in the listed statii regardless of
# the requested state
# the requested state
decon . result [ ' failed ' ] = True
decon . result [ ' failed ' ] = True
decon . result [ ' changed ' ] = False
decon . result [ ' changed ' ] = False
decon . result [ ' msg ' ] = ( " No change can be done for existing ViNS ID {} because of its current "
decon . result [ ' msg ' ] = ( " No change can be done for existing ViNS ID {} because of its current "
" status ' {} ' " ) . format ( vins_id, vins_facts [ ' status ' ] )
" status ' {} ' " ) . format ( decon. vins_id, decon . vins_facts [ ' status ' ] )
elif vins_facts[ ' status ' ] == " DISABLED " :
elif decon. vins_facts[ ' status ' ] == " DISABLED " :
if amodule . params [ ' state ' ] == ' absent ' :
if amodule . params [ ' state ' ] == ' absent ' :
decon . vins_delete ( vins_id , permanently = True )
decon . delete ( )
vins_facts [ ' status ' ] = ' DESTROYED '
vins_should_exist = False
vins_should_exist = False
elif amodule . params [ ' state ' ] in ( ' present ' , ' disabled ' ) :
elif amodule . params [ ' state ' ] in ( ' present ' , ' disabled ' ) :
# update ViNS, leave in disabled state
# update ViNS, leave in disabled state
decon . vins_update ( vins_facts ,
decon . action ( )
amodule . params [ ' ext_net_id ' ] , amodule . params [ ' ext_ip_addr ' ] )
elif amodule . params [ ' state ' ] == ' enabled ' :
elif amodule . params [ ' state ' ] == ' enabled ' :
# update ViNS and enable
# update ViNS and enable
decon . vins_update ( vins_facts ,
decon . action ( ' enabled ' )
amodule . params [ ' ext_net_id ' ] , amodule . params [ ' ext_ip_addr ' ] )
elif decon . vins_facts [ ' status ' ] in [ " CREATED " , " ENABLED " ] :
decon . vins_state ( vins_facts , ' enabled ' )
elif vins_facts [ ' status ' ] in [ " CREATED " , " ENABLED " ] :
if amodule . params [ ' state ' ] == ' absent ' :
if amodule . params [ ' state ' ] == ' absent ' :
decon . vins_delete ( vins_id , permanently = True )
decon . delete ( )
vins_facts [ ' status ' ] = ' DESTROYED '
vins_should_exist = False
vins_should_exist = False
elif amodule . params [ ' state ' ] in ( ' present ' , ' enabled ' ) :
elif amodule . params [ ' state ' ] in ( ' present ' , ' enabled ' ) :
# update ViNS
# update ViNS
decon . vins_update ( vins_facts ,
decon . action ( )
amodule . params [ ' ext_net_id ' ] , amodule . params [ ' ext_ip_addr ' ] ,
)
decon . vins_update_mgmt (
vins_facts ,
amodule . params [ ' mgmtaddr ' ] ,
)
decon . vins_update_ifaces (
vins_facts ,
amodule . params [ ' connect_to ' ] ,
)
elif amodule . params [ ' state ' ] == ' disabled ' :
elif amodule . params [ ' state ' ] == ' disabled ' :
# disable and update ViNS
# disable and update ViNS
decon . vins_state ( vins_facts , ' disabled ' )
decon . action ( ' disabled ' )
decon . vins_update ( vins_facts ,
elif decon . vins_facts [ ' status ' ] == " DELETED " :
amodule . params [ ' ext_net_id ' ] , amodule . params [ ' ext_ip_addr ' ] )
elif vins_facts [ ' status ' ] == " DELETED " :
if amodule . params [ ' state ' ] in [ ' present ' , ' enabled ' ] :
if amodule . params [ ' state ' ] in [ ' present ' , ' enabled ' ] :
# restore and enable
# restore and enable
decon . vins_restore ( arg_vins_id = vins_id )
decon . action ( restore = True )
decon . vins_state ( vins_facts , ' enabled ' )
vins_should_exist = True
vins_should_exist = True
elif amodule . params [ ' state ' ] == ' absent ' :
elif amodule . params [ ' state ' ] == ' absent ' :
# destroy permanently
# destroy permanently
decon . vins_delete ( vins_id , permanently = True )
decon . delete ( )
vins_facts [ ' status ' ] = ' DESTROYED '
vins_should_exist = False
vins_should_exist = False
elif amodule . params [ ' state ' ] == ' disabled ' :
elif amodule . params [ ' state ' ] == ' disabled ' :
# error
decon . error ( )
decon . result [ ' failed ' ] = True
decon . result [ ' changed ' ] = False
decon . result [ ' msg ' ] = ( " Invalid target state ' {} ' requested for ViNS ID {} in the "
" current status ' {} ' " ) . format ( vins_id ,
amodule . params [ ' state ' ] ,
vins_facts [ ' status ' ] )
vins_should_exist = False
vins_should_exist = False
elif vins_facts[ ' status ' ] == " DESTROYED " :
elif decon . vins_facts [ ' status ' ] == " DESTROYED " :
if amodule . params [ ' state ' ] in ( ' present ' , ' enabled ' ) :
if amodule . params [ ' state ' ] in ( ' present ' , ' enabled ' ) :
# need to re-provision ViNS; some attributes may be changed, some stay the same.
# need to re-provision ViNS;
# account and RG - stays the same
decon . create ( )
# vins_name - stays the same
# IPcidr - take from module arguments
# ext IP address - take from module arguments
# annotation - take from module arguments
vins_id = decon . vins_provision ( vins_facts [ ' name ' ] ,
validated_acc_id , validated_rg_id ,
amodule . params [ ' ipcidr ' ] ,
amodule . params [ ' ext_net_id ' ] , amodule . params [ ' ext_ip_addr ' ] ,
amodule . params [ ' annotation ' ] )
vins_should_exist = True
vins_should_exist = True
elif amodule . params [ ' state ' ] == ' absent ' :
elif amodule . params [ ' state ' ] == ' absent ' :
# nop
decon . nop ( )
decon . result [ ' failed ' ] = False
decon . result [ ' changed ' ] = False
decon . result [ ' msg ' ] = ( " No state change required for ViNS ID {} because of its "
" current status ' {} ' " ) . format ( vins_id ,
vins_facts [ ' status ' ] )
vins_should_exist = False
vins_should_exist = False
elif amodule . params [ ' state ' ] == ' disabled ' :
elif amodule . params [ ' state ' ] == ' disabled ' :
# error
decon . error ( )
decon . result [ ' failed ' ] = True
decon . result [ ' changed ' ] = False
decon . result [ ' msg ' ] = ( " Invalid target state ' {} ' requested for ViNS ID {} in the "
" current status ' {} ' " ) . format ( vins_id ,
amodule . params [ ' state ' ] ,
vins_facts [ ' status ' ] )
else :
else :
# Preexisting ViNS was not found.
# Preexisting ViNS was not found.
vins_should_exist = False # we will change it back to True if ViNS is created or restored
vins_should_exist = False # we will change it back to True if ViNS is created or restored
# If requested state is 'absent' - nothing to do
# If requested state is 'absent' - nothing to do
if amodule . params [ ' state ' ] == ' absent ' :
if amodule . params [ ' state ' ] == ' absent ' :
decon . result [ ' failed ' ] = False
decon . nop ( )
decon . result [ ' changed ' ] = False
decon . result [ ' msg ' ] = ( " Nothing to do as target state ' absent ' was requested for "
" non-existent ViNS name ' {} ' " ) . format ( amodule . params [ ' vins_name ' ] )
elif amodule . params [ ' state ' ] in ( ' present ' , ' enabled ' ) :
elif amodule . params [ ' state ' ] in ( ' present ' , ' enabled ' ) :
decon . check_amodule_argument ( ' vins_name ' )
decon . check_amodule_argument ( ' vins_name ' )
# as we already have account ID and RG ID we can create ViNS and get vins_id on success
# as we already have account ID and RG ID we can create ViNS and get vins_id on success
vins_id = decon . vins_provision ( amodule . params [ ' vins_name ' ] ,
decon . create ( )
validated_acc_id , validated_rg_id ,
amodule . params [ ' ipcidr ' ] ,
amodule . params [ ' ext_net_id ' ] , amodule . params [ ' ext_ip_addr ' ] ,
amodule . params [ ' annotation ' ] )
vins_should_exist = True
vins_should_exist = True
elif amodule . params [ ' state ' ] == ' disabled ' :
elif amodule . params [ ' state ' ] == ' disabled ' :
decon . result [ ' failed ' ] = True
decon . error ( )
decon . result [ ' changed ' ] = False
decon . result [ ' msg ' ] = ( " Invalid target state ' {} ' requested for non-existent "
" ViNS name ' {} ' " ) . format ( amodule . params [ ' state ' ] ,
amodule . params [ ' vins_name ' ] )
#
#
# conditional switch end - complete module run
# conditional switch end - complete module run
#
#
@ -593,18 +638,9 @@ def main():
amodule . fail_json ( * * decon . result )
amodule . fail_json ( * * decon . result )
else :
else :
# prepare ViNS facts to be returned as part of decon.result and then call exit_json(...)
# prepare ViNS facts to be returned as part of decon.result and then call exit_json(...)
if vins_should_exist :
if decon . result [ ' changed ' ] :
if decon . result [ ' changed ' ] :
# If we arrive here, there is a good chance that the ViNS is present - get fresh ViNS
_ , decon . vins_facts = decon . vins_find ( decon . vins_id )
# facts from # the cloud by ViNS ID.
decon . result [ ' facts ' ] = decon . package_facts ( amodule . check_mode )
# Otherwise, ViNS facts from previous call (when the ViNS was still in existence) will
# be returned.
_ , vins_facts = decon . vins_find ( vins_id )
decon . result [ ' facts ' ] = decort_vins_package_facts ( vins_facts , amodule . check_mode )
# add password to facts if mgmtaddr is present
# need reworking
if amodule . params [ ' mgmtaddr ' ] != " " :
decon . result [ ' facts ' ] . update ( { ' password ' : vins_facts [ ' VNFDev ' ] [ ' config ' ] [ ' mgmt ' ] [ ' password ' ] } )
amodule . exit_json ( * * decon . result )
amodule . exit_json ( * * decon . result )