Example #1
0
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()
Example #2
0
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()
Example #3
0
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()
Example #4
0
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()
Example #5
0
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()