class DeviceTemplate(ConfigItem): api_path = ConditionalApiPath( ApiPath('template/device/object', 'template/device/feature', 'template/device'), ApiPath('template/device/object', 'template/device/cli', 'template/device') ) store_path = ('templates', 'device_template') store_file = '{item_id}.json' id_tag = 'templateId' name_tag = 'templateName' post_filtered_tags = ('feature', ) skip_cmp_tag_set = {'createdOn', '@rid', 'lastUpdatedOn', 'templateAttached', 'owner', 'infoTag'}
class DeviceTemplateAttach(ApiItem): api_path = ApiPath(None, 'template/device/config/attachfeature', None, None) id_tag = 'id' @staticmethod def api_params(template_input_iter, is_edited): """ Build dictionary used to provide input parameters for api POST call :param template_input_iter: An iterable of (<template_id>, <input_list>) tuples. Input_list is a list where each entry represents one attached device and is a dictionary of input variable names and values. :param is_edited: True if this is an in-place re-attach, False if this is a template attach. :return: Dictionary used to provide POST input parameters """ def template_entry(template_id, template_input_list): return { "templateId": template_id, "device": template_input_list, "isEdited": is_edited, "isMasterEdited": False, } return { "deviceTemplateList": [ template_entry(item_id, input_list) for item_id, input_list in template_input_iter ] }
class PolicyVsmartActivate(ApiItem): api_path = ApiPath(None, 'template/policy/vsmart/activate', None, None) id_tag = 'id' @staticmethod def api_params(is_edited): return {"isEdited": True} if is_edited else {}
class ActionStatus(ApiItem): api_path = ApiPath('device/action/status', None, None, None) @property def status(self): return self.data.get('summary', {}).get('status', None) @property def is_completed(self): return self.status == 'done' @property def is_successful(self): def task_success(task_entry): return task_entry['status'] == 'Success' data_list = self.data.get('data', []) # When action validation fails, returned data is empty if len(data_list) == 0: return False return all(map(task_success, data_list)) @property def activity_details(self): def device_details(task_entry): return '{hostname}: {activity}'.format(hostname=task_entry.get('host-name', '<unknown>'), activity=', '.join(task_entry.get('activity', []))) data_list = self.data.get('data', []) # When action validation fails, returned data is empty if len(data_list) == 0: return 'No data in action status' return ', '.join(map(device_details, data_list))
class FeatureTemplate(ConfigItem): api_path = ApiPath('template/feature/object', 'template/feature') store_path = ('templates', 'feature_template') store_file = '{item_id}.json' id_tag = 'templateId' name_tag = 'templateName' skip_cmp_tag_set = {'createdOn', 'createdBy', 'lastUpdatedBy', 'lastUpdatedOn', '@rid', 'owner', 'infoTag', 'devicesAttached', 'attachedMastersCount'}
class PolicyVsmartIndex(IndexConfigItem): api_path = ApiPath('template/policy/vsmart', None, None, None) store_file = 'vsmart_policy_list.json' iter_fields = ('policyId', 'policyName') def active_policy_iter(self): return ( (item_id, item_name) for is_active, item_id, item_name in self.iter('isPolicyActivated', *self.iter_fields) if is_active )
class PolicyVsmartStatus(ApiItem): api_path = ApiPath('template/policy/vsmart/connectivity/status', None, None, None) def raise_for_status(self): def vsmart_ready(vsmart_entry): return vsmart_entry['operationMode'] == 'vmanage' and vsmart_entry['isOnline'] data_list = self.data.get('data', []) if len(data_list) == 0 or not all(map(vsmart_ready, data_list)): raise PolicyVsmartStatusException()
class DeviceModeCli(ApiItem): api_path = ApiPath(None, 'template/config/device/mode/cli', None, None) id_tag = 'id' @staticmethod def api_params(device_type, *device_ids): return { "deviceType": device_type, "devices": [{"deviceId": device_id} for device_id in device_ids] }
class DeviceTemplateIndex(IndexConfigItem): api_path = ApiPath('template/device', None, None, None) store_file = 'device_template_list.json' iter_fields = ('templateId', 'templateName') @staticmethod def is_vsmart(device_type, num_attached): return device_type == 'vsmart' and num_attached > 0 @staticmethod def is_not_vsmart(device_type, num_attached): return device_type != 'vsmart' and num_attached > 0 def filtered_iter(self, filter_fn): return ( (item_id, item_name) for item_type, item_attached, item_id, item_name in self.iter('deviceType', 'devicesAttached', *self.iter_fields) if filter_fn(item_type, item_attached) )
class ControlInventory(IndexApiItem): api_path = ApiPath('system/device/controllers', None, None, None) iter_fields = ('uuid', 'validity') @staticmethod def is_vsmart(device_type): return device_type == 'vsmart' @staticmethod def is_vbond(device_type): return device_type == 'vbond' @staticmethod def is_manage(device_type): return device_type == 'vmanage' def filtered_iter(self, filter_fn): return ( (item_id, item_name) for item_type, item_id, item_name in self.iter('deviceType', *self.iter_fields) if filter_fn(item_type) )
class DeviceTemplateValues(ConfigItem): api_path = ApiPath(None, 'template/device/config/input', None, None) store_path = ('templates', 'device_template_values') store_file = '{item_id}.json' @staticmethod def api_params(template_id, device_uuid_list): """ Build dictionary used to provide input parameters for api POST call :param template_id: String containing the template ID :param device_uuid_list: List of device UUIDs :return: Dictionary used to provide POST input parameters """ return { "deviceIds": device_uuid_list, "isEdited": False, "isMasterEdited": False, "templateId": template_id } def input_list(self, allowed_uuid_set=None): """ Return list of device input entries. Each entry represents one attached device and is a dictionary of input variable names and values. :param allowed_uuid_set: Optional, set of uuids. If provided, only input entries for those uuids are returned :return: [{<input_var_name>: <input_var_value>, ...}, ...] """ return [entry for entry in self.data.get('data', []) if allowed_uuid_set is None or entry.get('csv-deviceId') in allowed_uuid_set] def values_iter(self): return ( (entry.get('csv-deviceId'), entry.get('csv-host-name'), entry) for entry in self.data.get('data', []) ) def title_dict(self): return {column['property']: column['title'] for column in self.data.get('header', {}).get('columns', [])} def __iter__(self): return self.values_iter()
class PolicyListTloc(PolicyList): api_path = ApiPath('template/policy/list/tloc') store_path = ('templates', 'policy_list_tloc')
class PolicyListAspathIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/aspath', None, None, None) store_file = 'aspath_policy_list.json'
class PolicyListUmbrellaSecretIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/umbrellasecret', None, None, None) store_file = 'umbrellasecret_policy_list.json'
class PolicyListCommunityIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/community', None, None, None) store_file = 'community_policy_list.json'
class PolicyListLocaldomainIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/localdomain', None, None, None) store_file = 'localdomain_policy_list.json'
class PolicyListIpv6prefixIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/ipv6prefix', None, None, None) store_file = 'ipv6prefix_policy_list.json'
class PolicyListTlocIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/tloc', None, None, None) store_file = 'tloc_policy_list.json'
class PolicyListIpv6prefix(PolicyList): api_path = ApiPath('template/policy/list/ipv6prefix') store_path = ('templates', 'policy_list_ipv6prefix')
class PolicyListSlaIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/sla', None, None, None) store_file = 'sla_policy_list.json'
class PolicyListLocaldomain(PolicyList): api_path = ApiPath('template/policy/list/localdomain') store_path = ('templates', 'policy_list_localdomain')
class PolicyListColor(PolicyList): api_path = ApiPath('template/policy/list/color') store_path = ('templates', 'policy_list_color')
class PolicyListCommunity(PolicyList): api_path = ApiPath('template/policy/list/community') store_path = ('templates', 'policy_list_community')
class PolicyListColorIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/color', None, None, None) store_file = 'color_policy_list.json'
class PolicyListUmbrellaSecret(PolicyList): api_path = ApiPath('template/policy/list/umbrellasecret') store_path = ('templates', 'policy_list_umbrellasecret')
class PolicyListZone(PolicyList): api_path = ApiPath('template/policy/list/zone') store_path = ('templates', 'policy_list_zone')
class PolicyListTGApiKey(PolicyList): api_path = ApiPath('template/policy/list/tgapikey') store_path = ('templates', 'policy_list_tgapikey')
class PolicyListZoneIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/zone', None, None, None) store_file = 'zone_policy_list.json'
class PolicyListTGApiKeyIndex(PolicyListIndex): api_path = ApiPath('template/policy/list/tgapikey', None, None, None) store_file = 'tgapikey_policy_list.json'
class PolicyListAspath(PolicyList): api_path = ApiPath('template/policy/list/aspath') store_path = ('templates', 'policy_list_aspath')