X-Git-Url: https://gerrit.onap.org/r/gitweb?p=dcaegen2%2Fplatform.git;a=blobdiff_plain;f=adapter%2Facumos%2Faoconversion%2Fspec_gen.py;fp=adapter%2Facumos%2Faoconversion%2Fspec_gen.py;h=1662872399e6d6b7e7da524b4c827e50382222a9;hp=0000000000000000000000000000000000000000;hb=849da15d5b7ddc68e4c2b90b603fc8948d4b5e6d;hpb=3f67c400813a60e4b8f9327e20eccc9033dc1b0b diff --git a/adapter/acumos/aoconversion/spec_gen.py b/adapter/acumos/aoconversion/spec_gen.py new file mode 100644 index 0000000..1662872 --- /dev/null +++ b/adapter/acumos/aoconversion/spec_gen.py @@ -0,0 +1,112 @@ +# ============LICENSE_START==================================================== +# org.onap.dcae +# ============================================================================= +# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# ============================================================================= +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END====================================================== + +""" +Generates DCAE component specs +""" + + +import json +from jsonschema import validate +import requests +from aoconversion import utils + + +def _get_dcae_cs_schema(): + res = requests.get( + "https://gerrit.onap.org/r/gitweb?p=dcaegen2/platform/cli.git;a=blob_plain;f=component-json-schemas/component-specification/dcae-cli-v2/component-spec-schema.json;hb=HEAD" + ) + return res.json() + + +def _get_format_version(target_name, data_formats): + """ + search through the data formats for name, make sure we have it, and retrieve the version + """ + # the df must exist, since the data formats were generated from the same metadata, or dataformats call blew up. + # So we don't do error checking here + for df in data_formats: + if df["self"]["name"] == target_name: + return df["self"]["version"] + + +def _generate_spec(model_name, meta, dcae_cs_schema, data_formats, docker_uri): + """ + Function that generates the component spec from the model metadata and docker info + Broken out to be unit-testable. + """ + + spec = { + "self": { + "version": "1.0.0", # hopefully we get this from somewhere and not hardcode this + "name": model_name, + "description": "Automatically generated from Acumos model", + "component_type": "docker", + }, + "services": {"calls": [], "provides": []}, + "streams": {"subscribes": [], "publishes": []}, + "parameters": [], + "auxilary": {"healthcheck": {"type": "http", "endpoint": "/healthcheck"}}, + "artifacts": [{"type": "docker image", "uri": docker_uri}], + } + + # from https://pypi.org/project/acumos-dcae-model-runner/ + # each model method gets a subscruber and a publisher, using the methood name + pstype = "message_router" + for method in meta["methods"]: + + df_in_name = meta["methods"][method]["input"] + subscriber = { + "config_key": "{0}_subscriber".format(method), + "format": df_in_name, + "version": _get_format_version(df_in_name, data_formats), + "type": pstype, + } + + spec["streams"]["subscribes"].append(subscriber) + + df_out_name = meta["methods"][method]["output"] + + publisher = { + "config_key": "{0}_publisher".format(method), + "format": df_out_name, + "version": _get_format_version(df_out_name, data_formats), + "type": pstype, + } + + spec["streams"]["publishes"].append(publisher) + + # Validate that we have a valid spec + validate(instance=spec, schema=dcae_cs_schema) + + return spec + + +def generate_spec(model_repo_path, model_name, data_formats, docker_uri): + """ + Generate and write the component spec to disk + Returns the spec + """ + spec = _generate_spec( + model_name, utils.get_metadata(model_repo_path, model_name), _get_dcae_cs_schema(), data_formats, docker_uri + ) + fname = "{0}_dcae_component_specification.json".format(model_name) + with open("{0}/{1}".format(model_repo_path, fname), "w") as f: + f.write(json.dumps(spec)) + + return spec