From b2b1fea8a0da80e59490f8c407a10915808cf004 Mon Sep 17 00:00:00 2001 From: "shiva-charan.m-s" Date: Tue, 26 Jul 2016 22:34:23 -0500 Subject: [PATCH] policy2tosca patch set-6 Change-Id: Id93490753ba93e4c3aa00cd487855e3d2970ae9a Signed-off-by: shiva-charan (cherry picked from commit d93490753ba93e4c3aa00cd487855e3d2970ae9a) --- policy2tosca/README.rst | 37 +++++ .../lib.linux-x86_64-2.7/policy2tosca/__init__.py | 0 .../policy2tosca/add_definition.py | 93 ++++++++++++ .../lib.linux-x86_64-2.7/policy2tosca/add_type.py | 121 ++++++++++++++++ .../policy2tosca/del_definition.py | 45 ++++++ .../lib.linux-x86_64-2.7/policy2tosca/del_type.py | 47 ++++++ .../lib.linux-x86_64-2.7/policy2tosca/main.py | 37 +++++ policy2tosca/dist/policy2tosca-0.1-py2.7.egg | Bin 0 -> 13250 bytes policy2tosca/policy2tosca.egg-info/PKG-INFO | 54 +++++++ policy2tosca/policy2tosca.egg-info/SOURCES.txt | 16 +++ .../policy2tosca.egg-info/dependency_links.txt | 1 + .../policy2tosca.egg-info/entry_points.txt | 9 ++ .../policy2tosca.egg-info/namespace_packages.txt | 1 + policy2tosca/policy2tosca.egg-info/not-zip-safe | 1 + policy2tosca/policy2tosca.egg-info/requires.txt | 1 + policy2tosca/policy2tosca.egg-info/top_level.txt | 1 + policy2tosca/policy2tosca/__init__.py | 0 policy2tosca/policy2tosca/add_definition.py | 157 +++++++++++++++++++++ policy2tosca/policy2tosca/add_type.py | 121 ++++++++++++++++ policy2tosca/policy2tosca/del_definition.py | 45 ++++++ policy2tosca/policy2tosca/del_type.py | 47 ++++++ policy2tosca/policy2tosca/main.py | 37 +++++ policy2tosca/setup.py | 75 ++++++++++ 23 files changed, 946 insertions(+) create mode 100644 policy2tosca/README.rst create mode 100644 policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/__init__.py create mode 100644 policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_definition.py create mode 100644 policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_type.py create mode 100644 policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_definition.py create mode 100644 policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_type.py create mode 100644 policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/main.py create mode 100644 policy2tosca/dist/policy2tosca-0.1-py2.7.egg create mode 100644 policy2tosca/policy2tosca.egg-info/PKG-INFO create mode 100644 policy2tosca/policy2tosca.egg-info/SOURCES.txt create mode 100644 policy2tosca/policy2tosca.egg-info/dependency_links.txt create mode 100644 policy2tosca/policy2tosca.egg-info/entry_points.txt create mode 100644 policy2tosca/policy2tosca.egg-info/namespace_packages.txt create mode 100644 policy2tosca/policy2tosca.egg-info/not-zip-safe create mode 100644 policy2tosca/policy2tosca.egg-info/requires.txt create mode 100644 policy2tosca/policy2tosca.egg-info/top_level.txt create mode 100644 policy2tosca/policy2tosca/__init__.py create mode 100644 policy2tosca/policy2tosca/add_definition.py create mode 100644 policy2tosca/policy2tosca/add_type.py create mode 100644 policy2tosca/policy2tosca/del_definition.py create mode 100644 policy2tosca/policy2tosca/del_type.py create mode 100644 policy2tosca/policy2tosca/main.py create mode 100644 policy2tosca/setup.py diff --git a/policy2tosca/README.rst b/policy2tosca/README.rst new file mode 100644 index 0000000..9877499 --- /dev/null +++ b/policy2tosca/README.rst @@ -0,0 +1,37 @@ +================= + Running demoapp +================= + +Pre-requisite +------------- + +Install cliff with the following links. +:: + +- `install ` + or +- `demoapp ` + +Setup +----- + +Now, install the policy2tosca module. +:: + + $ cd policy2tosca + $ python setup.py install + +Usage +----- + +To see a list of commands available, run +:: + + $ policy2tosca --help + + +To see help for an individual command, include the command name on the command line +:: + + $ policy2tosca help add_type + diff --git a/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/__init__.py b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_definition.py b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_definition.py new file mode 100644 index 0000000..953c377 --- /dev/null +++ b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_definition.py @@ -0,0 +1,93 @@ +# 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. + +import logging +import os +import re +from cliff.command import Command +from cliff.show import ShowOne + + +class add_definition(Command): + "Add policy definition in a tosca file" + + log = logging.getLogger(__name__) + + def get_parser(self, prog_name): + parser = super(add_definition, self).get_parser(prog_name) + parser.add_argument('--policy_name', dest='policy_name', required=True, + help='add policy name') + parser.add_argument('--policy_type', dest='policy_type', required=True, + help='belongs to policy type') + parser.add_argument('--targets', dest='targets', nargs='+', + help='specify N number of targets') + parser.add_argument('--metadata', dest='metadata', nargs='?', + help='metadata') + parser.add_argument('--description', dest='description', nargs='?', + help='description') + parser.add_argument('--properties', dest='properties', nargs='+', + help='properties') + parser.add_argument('--triggers', dest='triggers', nargs='+', + help='triggers') + parser.add_argument('--source', dest='source', nargs='?', + help='source tosca yaml file') + return parser + + def take_action(self, parsed_args): + inputfile = open(parsed_args.source, 'r').readlines() + policy_def = 0 + policy_type = 0 + policy_type = self.check_policy_type(parsed_args) + policy_def = self.check_definition(parsed_args) + if policy_def == 0 and policy_type == 0: + self.insert_policy_def(parsed_args) + + def check_definition(self, parsed_args): + filename = parsed_args.source + filehandler = open(filename, "r") + lines = filehandler.readlines() + policy_def = 0 + policy_name = " - " + str(parsed_args.policy_name) + ":" + for line in lines: + if policy_name in line: + print "policy definition exists" + policy_def = 1 + return policy_def + + def insert_policy_def(self, parsed_args): + filename = parsed_args.source + filehandle = open(filename, "a") + print "Adding Definition" + filehandle.write(" - " + str(parsed_args.policy_name) + ":\n") + filehandle.write(" type: " + str(parsed_args.policy_type) + + "\n") + filehandle.write(" description: " + str(parsed_args.description) + + "\n") + filehandle.write(" metadata: \n " + + str(parsed_args.metadata) + "\n") + filehandle.write(" properties: \n " + + str(parsed_args.properties) + "\n") + filehandle.write(" targets:\n " + + str(parsed_args.targets) + "\n") + filehandle.write(" triggers: \n " + + str(parsed_args.triggers) + "\n") + + def check_policy_type(self, parsed_args): + policy_name = parsed_args.policy_type + ":$" + inputfile = open(parsed_args.source, 'r').readlines() + policy_exists = 0 + for line in inputfile: + if re.search(policy_name, line): + print "policy type exists" + policy_exists = 1 + return policy_exists diff --git a/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_type.py b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_type.py new file mode 100644 index 0000000..0afa0e8 --- /dev/null +++ b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/add_type.py @@ -0,0 +1,121 @@ +# 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. + +import logging +import os +from cliff.command import Command +from cliff.show import ShowOne +import re + + +class add_type(Command): + + "Add policy type in a tosca file" + log = logging.getLogger(__name__) + + def get_parser(self, prog_name): + parser = super(add_type, self).get_parser(prog_name) + parser.add_argument('--policy_type', dest='policy_type', nargs='?', + help='add policy type') + parser.add_argument('--derived_from', dest='derived_from', nargs='?', + help='policy dervied from') + parser.add_argument('--version_number', dest='version_number', + nargs='?', help='version number of the policy') + parser.add_argument('--targets', dest='targets', nargs='+', + help='specify N number of targets') + parser.add_argument('--metadata', dest='metadata', nargs='?', + help='metadata') + parser.add_argument('--description', dest='description', nargs='?', + help='metadata') + parser.add_argument('--properties', dest='properties', nargs='+', + help='properties') + parser.add_argument('--triggers', dest='triggers', nargs='+', + help='triggers') + parser.add_argument('--source', dest='source', nargs='?', + help='source tosca yaml file') + return parser + + def take_action(self, parsed_args): + inputfile = open(parsed_args.source, 'r').readlines() + policy_block = 0 + for line in inputfile: + if re.search('policy_types:', line): + print "policy block exists" + policy_block = 1 + if policy_block == 0: + self.insert_policy_block(parsed_args) + policy_block = 1 + policy_exists = self.check_policy(parsed_args) + if policy_exists == 0: + self.insert_policy(parsed_args) + + def insert_policy_block(self, parsed_args): + inputfile = open(parsed_args.source, 'r').readlines() + filename = parsed_args.source + "_temp" + filehandle = open(filename, 'w') + for line in inputfile: + filehandle.write(line) + if re.search('topology_template:', line): + print "Inserting policy block" + filehandle.write("\tpolicy_types:\n") + + filehandle.close() + filehandles = open(parsed_args.source, "w") + filename = parsed_args.source + "_temp" + filehandle = open(filename, 'r') + lines = filehandle.readlines() + for line in lines: + filehandles.write(line) + os.system('rm '+filename) + + def check_policy(self, parsed_args): + policy_name = parsed_args.policy_type + ":$" + inputfile = open(parsed_args.source, 'r').readlines() + policy_exists = 0 + for line in inputfile: + if re.search(policy_name, line): + print "policy type exists" + policy_exists = 1 + return policy_exists + + def insert_policy(self, parsed_args): + inputfile = open(parsed_args.source, 'r').readlines() + filename = parsed_args.source + "_temp" + filehandle = open(filename, 'w') + for line in inputfile: + filehandle.write(line) + if re.search('policy_types:', line): + print "Inserting policy type" + filehandle.write("\t "+str(parsed_args.policy_type) + ":\n") + filehandle.write("\t derived_from: " + + str(parsed_args.derived_from) + "\n") + filehandle.write("\t version: " + + str(parsed_args.version_number) + "\n") + filehandle.write("\t description: " + + str(parsed_args.description) + "\n") + filehandle.write("\t metadata: \n\t " + + str(parsed_args.metadata) + "\n") + filehandle.write("\t properties: \n\t " + + str(parsed_args.properties) + "\n") + filehandle.write("\t targets:\n\t " + + str(parsed_args.targets) + "\n") + filehandle.write("\t triggers: \n\t " + + str(parsed_args.triggers) + "\n") + filehandle.close() + filehandles = open(parsed_args.source, "w") + filename = parsed_args.source + "_temp" + filehandle = open(filename, 'r') + lines = filehandle.readlines() + for line in lines: + filehandles.write(line) + os.system('rm ' + filename) diff --git a/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_definition.py b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_definition.py new file mode 100644 index 0000000..f1b9132 --- /dev/null +++ b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_definition.py @@ -0,0 +1,45 @@ +# 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. + +import logging +import os +from cliff.command import Command +from cliff.show import ShowOne +import yaml +import json + + +class delete_definition(Command): + "Delete policy in a tosca file" + + log = logging.getLogger(__name__) + + def get_parser(self, prog_name): + parser = super(delete_definition, self).get_parser(prog_name) + parser.add_argument('--policy_name', dest='policy_name', nargs='?', + help='delete policy') + parser.add_argument('--source', dest='source', nargs='?', + help='source tosca yaml file') + return parser + + def take_action(self, parsed_args): + yml = open(parsed_args.source, "r") + data = yaml.load(yml) + json_dump = json.dumps(data) + tosca_json = json.loads(json_dump) + del tosca_json['topology_template']['policies'][parsed_args.policy_name] + tosca = json.dumps(tosca_json) + data2 = json.loads(tosca) + yml2 = yaml.safe_dump(data2, default_flow_style=False) + tosca_file = open(parsed_args.source, "w") + tosca_file.write(yml2) diff --git a/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_type.py b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_type.py new file mode 100644 index 0000000..70adc0e --- /dev/null +++ b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/del_type.py @@ -0,0 +1,47 @@ +# 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. + +import logging +import os +from cliff.command import Command +from cliff.show import ShowOne +import yaml +import json + + +class delete_type(Command): + "Delete policy type in a tosca file" + + log = logging.getLogger(__name__) + + def get_parser(self, prog_name): + parser = super(delete_type, self).get_parser(prog_name) + parser.add_argument('--policy_type', dest='policy_type', nargs='?', + help='delete policy type') + parser.add_argument('--source', dest='source', nargs='?', + help='source tosca yaml file') + return parser + + def take_action(self, parsed_args): + yml = open(parsed_args.source, "r") + #lines=filehandle.readlines() + data = yaml.load(yml) + json_dump = json.dumps(data) + #print json_dump + tosca_json = json.loads(json_dump) + del tosca_json['topology_template']['policy_types'][parsed_args.policy_type] + tosca = json.dumps(tosca_json) + data2 = json.loads(tosca) + yml2 = yaml.safe_dump(data2, default_flow_style=False) + tosca_file = open(parsed_args.source, "w") + tosca_file.write(yml2) diff --git a/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/main.py b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/main.py new file mode 100644 index 0000000..39aabfa --- /dev/null +++ b/policy2tosca/build/lib.linux-x86_64-2.7/policy2tosca/main.py @@ -0,0 +1,37 @@ +import logging +import sys + +from cliff.app import App +from cliff.commandmanager import CommandManager + + +class policy2tosca(App): + + log = logging.getLogger(__name__) + + def __init__(self): + super(policy2tosca, self).__init__( + description='Parser Policy2Tosca', + version='0.1', + command_manager=CommandManager('cliff.demo'), + ) + + def initialize_app(self, argv): + self.log.debug('initialize_app') + + def prepare_to_run_command(self, cmd): + self.log.debug('prepare_to_run_command %s', cmd.__class__.__name__) + + def clean_up(self, cmd, result, err): + self.log.debug('clean_up %s', cmd.__class__.__name__) + if err: + self.log.debug('got an error: %s', err) + + +def main(argv=sys.argv[1:]): + myapp = policy2tosca() + return myapp.run(argv) + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/policy2tosca/dist/policy2tosca-0.1-py2.7.egg b/policy2tosca/dist/policy2tosca-0.1-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..cf512aec0b50a65217aa47acde47f17c4004525c GIT binary patch literal 13250 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