def render_package_template(cls): LOG.debug("Rendering {} package template".format(cls.__name__)) if not isinstance(cls, PackageType): raise TypeError("{} is not of type {}".format(cls, PackageType)) # Entity context entity_context = "Package_" + cls.__name__ user_attrs = cls.get_user_attrs() user_attrs["name"] = cls.__name__ user_attrs["description"] = cls.__doc__ or "" # Update package name map gui_display_name = getattr(cls, "name", "") or cls.__name__ if gui_display_name != cls.__name__: user_attrs["gui_display_name"] = gui_display_name # updating ui and dsl name mapping update_package_name(gui_display_name, cls.__name__) service_list = [] for entity in user_attrs.get("services", []): service_list.append(render_ref_template(entity)) variable_list = [] for entity in user_attrs.get("variables", []): variable_list.append(render_variable_template(entity, entity_context)) action_list = [] if hasattr(cls, "__install__"): cls.__install__.__name__ = "__install__" cls.__install__.name = "__install__" action_list.append(render_action_template(cls.__install__, entity_context)) if hasattr(cls, "__uninstall__"): cls.__uninstall__.__name__ = "__uninstall__" cls.__uninstall__.name = "__uninstall__" action_list.append(render_action_template(cls.__uninstall__, entity_context)) user_attrs["services"] = ",".join(service_list) user_attrs["variables"] = variable_list user_attrs["actions"] = action_list text = render_template("package.py.jinja2", obj=user_attrs) return text.strip()
def render_service_template(cls): LOG.debug("Rendering {} service template".format(cls.__name__)) if not isinstance(cls, ServiceType): raise TypeError("{} is not of type {}".format(cls, ServiceType)) # Entity context entity_context = "Service_" + cls.__name__ user_attrs = cls.get_user_attrs() user_attrs["name"] = cls.__name__ user_attrs["description"] = cls.__doc__ or "" # Update service name map and gui name gui_display_name = getattr(cls, "name", "") or cls.__name__ if gui_display_name != cls.__name__: user_attrs["gui_display_name"] = gui_display_name # updating ui and dsl name mapping update_service_name(gui_display_name, cls.__name__) depends_on_list = [] for entity in user_attrs.get("dependencies", []): depends_on_list.append(render_ref_template(entity)) variable_list = [] for entity in user_attrs.get("variables", []): variable_list.append(render_variable_template(entity, entity_context)) action_list = [] system_actions = { v: k for k, v in ServiceType.ALLOWED_SYSTEM_ACTIONS.items() } for entity in user_attrs.get("actions", []): if entity.__name__ in list(system_actions.keys()): entity.name = system_actions[entity.__name__] entity.__name__ = system_actions[entity.__name__] rendered_txt = render_action_template(entity, entity_context) if rendered_txt: action_list.append(rendered_txt) user_attrs["dependencies"] = ",".join(depends_on_list) user_attrs["variables"] = variable_list user_attrs["actions"] = action_list # TODO add ports, ..etc. text = render_template("service.py.jinja2", obj=user_attrs) return text.strip()
def render_profile_template(cls): LOG.debug("Rendering {} profile template".format(cls.__name__)) if not isinstance(cls, ProfileType): raise TypeError("{} is not of type {}".format(cls, ProfileType)) # Entity context entity_context = "Profile_" + cls.__name__ user_attrs = cls.get_user_attrs() user_attrs["name"] = cls.__name__ user_attrs["description"] = cls.__doc__ or "" # Update profile name map and gui name gui_display_name = getattr(cls, "name", "") or cls.__name__ if gui_display_name != cls.__name__: user_attrs["gui_display_name"] = gui_display_name # updating ui and dsl name mapping update_profile_name(gui_display_name, cls.__name__) action_list = [] for action in user_attrs.get("actions", []): action_list.append(render_action_template(action, entity_context)) deployment_list = [] for deployment in user_attrs.get("deployments", []): deployment_list.append(deployment.__name__) variable_list = [] for entity in user_attrs.get("variables", []): variable_list.append(render_variable_template(entity, entity_context)) user_attrs["variables"] = variable_list user_attrs["deployments"] = ", ".join(deployment_list) user_attrs["actions"] = action_list text = render_template("profile.py.jinja2", obj=user_attrs) return text.strip()
def render_profile_template(cls): LOG.debug("Rendering {} profile template".format(cls.__name__)) if not isinstance(cls, ProfileType): raise TypeError("{} is not of type {}".format(cls, ProfileType)) # Entity context entity_context = "Profile_" + cls.__name__ user_attrs = cls.get_user_attrs() user_attrs["name"] = cls.__name__ user_attrs["description"] = cls.__doc__ or "" # Update profile name map and gui name gui_display_name = getattr(cls, "name", "") or cls.__name__ if gui_display_name != cls.__name__: user_attrs["gui_display_name"] = gui_display_name # updating ui and dsl name mapping update_profile_name(gui_display_name, cls.__name__) restore_config_list = [] for idx, entity in enumerate(user_attrs.get("restore_configs", [])): CONFIG_SPEC_MAP[entity.name] = { "global_name": "{}.restore_configs[{}]".format(cls.__name__, idx), "local_name": "restore_configs[{}]".format(idx), } restore_config_list.append( render_restore_config_template(entity, entity_context)) snapshot_config_list = [] for idx, entity in enumerate(user_attrs.get("snapshot_configs", [])): CONFIG_SPEC_MAP[entity.name] = { "global_name": "{}.snapshot_configs[{}]".format(cls.__name__, idx), "local_name": "snapshot_configs[{}]".format(idx), } snapshot_config_list.append( render_snapshot_config_template(entity, entity_context, CONFIG_SPEC_MAP)) update_config_list = [] for idx, entity in enumerate(user_attrs.get("update_configs", [])): CONFIG_SPEC_MAP[entity.name] = { "global_name": "{}.update_configs[{}]".format(cls.__name__, idx), "local_name": "update_configs[{}]".format(idx), } update_config_list.append( render_update_config_template(entity, entity_context)) action_list = [] for action in user_attrs.get("actions", []): action_list.append( render_action_template(action, entity_context, CONFIG_SPEC_MAP)) deployment_list = [] for deployment in user_attrs.get("deployments", []): deployment_list.append(deployment.__name__) variable_list = [] for entity in user_attrs.get("variables", []): variable_list.append(render_variable_template(entity, entity_context)) user_attrs["variables"] = variable_list user_attrs["deployments"] = ", ".join(deployment_list) user_attrs["actions"] = action_list user_attrs["restore_configs"] = ", ".join(restore_config_list) user_attrs["snapshot_configs"] = ", ".join(snapshot_config_list) text = render_template("profile.py.jinja2", obj=user_attrs) return text.strip()
def render_substrate_template(cls, vm_images=[]): LOG.debug("Rendering {} substrate template".format(cls.__name__)) if not isinstance(cls, SubstrateType): raise TypeError("{} is not of type {}".format(cls, SubstrateType)) # Entity context entity_context = "Substrate_" + cls.__name__ user_attrs = cls.get_user_attrs() user_attrs["name"] = cls.__name__ user_attrs["description"] = cls.__doc__ or "" # Update substrate name map and gui name gui_display_name = getattr(cls, "name", "") or cls.__name__ if gui_display_name != cls.__name__: user_attrs["gui_display_name"] = gui_display_name # updating ui and dsl name mapping update_substrate_name(gui_display_name, cls.__name__) provider_spec_editables = user_attrs.get("provider_spec_editables", {}) create_spec_editables = provider_spec_editables.get("create_spec", {}) readiness_probe_editables = provider_spec_editables.get( "readiness_probe", {}) # Handle readiness probe for substrate rp_editable_list = [] for k, v in readiness_probe_editables.items(): if v: rp_editable_list.append(k) # Appending readiness_probe editables to readiness_probe object readiness_probe = user_attrs["readiness_probe"] readiness_probe.editables_list = rp_editable_list user_attrs["readiness_probe"] = render_readiness_probe_template( user_attrs["readiness_probe"]) spec_dir = get_specs_dir() # Handle create spec runtime editables if create_spec_editables: create_spec_editable_file_name = cls.__name__ + "_create_spec_editables.yaml" file_location = os.path.join(spec_dir, create_spec_editable_file_name) dsl_file_location_alias = "os.path.join('{}', '{}')".format( get_specs_dir_key(), create_spec_editable_file_name) user_attrs["provider_spec_editables"] = "read_spec({})".format( dsl_file_location_alias) # Write editable spec to separate file with open(file_location, "w+") as fd: fd.write(yaml.dump(create_spec_editables, default_flow_style=False)) # Handle provider_spec for substrate provider_spec = cls.provider_spec if cls.provider_type == "AHV_VM": boot_config = provider_spec["resources"].get("boot_config", {}) if not boot_config: LOG.error("Boot config not present in {} substrate spec".format( cls.__name__)) sys.exit(-1) vm_cls = AhvVmType.decompile( provider_spec, context=[cls.__schema_name__, gui_display_name]) user_attrs["provider_spec"] = vm_cls.__name__ ahv_vm_str = render_ahv_vm(vm_cls, boot_config) else: # creating a file for storing provider_spec provider_spec_file_name = cls.__name__ + "_provider_spec.yaml" user_attrs["provider_spec"] = get_provider_spec_string( spec=provider_spec, filename=provider_spec_file_name, provider_type=cls.provider_type, vm_images=vm_images, ) # Write provider spec to separate file file_location = os.path.join(spec_dir, provider_spec_file_name) with open(file_location, "w+") as fd: fd.write(yaml.dump(provider_spec, default_flow_style=False)) # Actions action_list = [] system_actions = { v: k for k, v in SubstrateType.ALLOWED_FRAGMENT_ACTIONS.items() } for action in user_attrs.get("actions", []): if action.__name__ in list(system_actions.keys()): action.name = system_actions[action.__name__] action.__name__ = system_actions[action.__name__] action_list.append(render_action_template(action, entity_context)) user_attrs["actions"] = action_list substrate_text = render_template(schema_file="substrate.py.jinja2", obj=user_attrs) if cls.provider_type == "AHV_VM": # Append definition for ahv vm class on top of substrate class substrate_text = "{}\n{}".format(ahv_vm_str, substrate_text) return substrate_text.strip()