1 # ============LICENSE_START=======================================================
3 # ================================================================================
4 # Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
5 # ================================================================================
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 # ============LICENSE_END=========================================================
19 # ECOMP is a trademark and service mark of AT&T Intellectual Property.
21 # -*- coding: utf-8 -*-
23 Provides dcae cli config utilities
30 from dcae_cli import util
31 from dcae_cli import _version
32 from dcae_cli.util import get_app_dir, get_pref, update_pref, write_pref, pref_exists
35 class ConfigurationInitError(RuntimeError):
38 def get_config_path():
39 '''Returns the absolute configuration file path'''
40 return os.path.join(get_app_dir(), 'config.json')
43 def _init_config_user():
45 user = click.prompt('Please enter your user id', type=str).strip()
47 # There should be no special characters
48 if re.match("(?:\w*)\Z", user):
51 click.echo("Invalid user id. Please try again.")
53 def _init_config_server_url():
54 return click.prompt("Please enter the remote server url", type=str).strip()
56 def _init_config_db_url():
57 click.echo("Now we need to set up access to the onboarding catalog")
58 hostname = click.prompt("Please enter the onboarding catalog hostname").strip()
59 user = click.prompt("Please enter the onboarding catalog user").strip()
60 password = click.prompt("Please enter the onboarding catalog password").strip()
61 return "postgresql://{user}:{password}@{hostname}:5432/dcae_onboarding_db".format(
62 hostname=hostname, user=user, password=password)
65 '''Returns an initial dict for populating the config'''
66 # Grab the remote config and merge it in
70 server_url = _init_config_server_url()
71 new_config = util.fetch_file_from_web(server_url, "/dcae-cli/config.json")
72 new_config["server_url"] = server_url
74 # Failing to pull seed configuration from remote server is not considered
75 # a problem. Just continue and give user the option to set it up
77 if not click.confirm("Could not download initial configuration from remote server. Attempt manually setting up?"):
78 raise ConfigurationInitError("Could not setup dcae-cli configuration")
80 new_config["user"] = _init_config_user()
81 new_config["cli_version"] = _version.__version__
83 if "db_url" not in new_config or not new_config["db_url"]:
84 # The seed configuration was not provided so manually set up the db
86 new_config["db_url"] = _init_config_db_url()
88 if "active_profile" not in new_config:
89 # The seed configuration was not provided which means the profiles will
90 # be the same. The profile will be hardcoded to a an empty default.
91 new_config["active_profile"] = "default"
96 def should_force_reinit(config):
97 """Configs older than 2.0.0 should be replaced"""
98 ver = config.get("cli_version", "0.0.0")
99 return int(ver.split(".")[0]) < 2
102 '''Returns the configuration dictionary'''
103 return get_pref(get_config_path(), _init_config)
105 def get_server_url():
106 """Returns the remote server url
108 The remote server holds the artifacts that the dcae-cli requires like the
109 seed config json and seed profiles json, and json schemas.
111 return get_config().get("server_url")
113 # These functions are used to fetch the configurable path to the various json
114 # schema files used in validation.
116 def get_path_component_spec():
117 return get_config().get("path_component_spec",
118 "/schemas/component-specification/dcae-cli-v1/component-spec-schema.json")
120 def get_path_data_format():
121 return get_config().get("path_data_format",
122 "/schemas/data-format/dcae-cli-v1/data-format-schema.json")
124 def get_active_profile():
125 return get_config().get("active_profile", None)
128 def update_config(**kwargs):
129 '''Updates and returns the configuration dictionary'''
130 return update_pref(path=get_config_path(), init_func=get_config, **kwargs)
133 def _reinit_config(init_func):
134 new_config = init_func()
135 config_path = get_config_path()
137 if pref_exists(config_path):
138 existing_config = get_config()
139 # Make sure to clobber existing values and not other way
140 existing_config.update(new_config)
141 new_config = existing_config
143 write_pref(new_config, config_path)
147 return _reinit_config(_init_config)