def _config_create(config_file, profile, ask_full=False): """Full/simplified dwave create flows.""" if ask_full: rs = Client._fetch_available_regions(DEFAULT_METADATA_API_ENDPOINT) prompts = dict( region=dict(prompt="Solver API region", choices=[r.code for r in rs]), endpoint=dict(prompt="Solver API endpoint URL (overwrites 'region')"), token=dict(prompt="Authentication token"), client=dict(prompt="Client class", choices='base qpu sw hybrid'.split()), solver=dict(prompt="Solver")) else: prompts = dict( token=dict(prompt="Authentication token")) click.echo("Using the simplified configuration flow.\n" "Try 'dwave config create --full' for more options.\n") # resolve config file path ask_to_confirm_config_path = not config_file if not config_file: config_file = get_configfile_path() if not config_file: config_file = get_default_configfile_path() config_file_exists = os.path.exists(config_file) verb = "Updating existing" if config_file_exists else "Creating new" click.echo(f"{verb} configuration file: {config_file}") if ask_full and ask_to_confirm_config_path: config_file = default_text_input("Confirm configuration file path", config_file) config_file = os.path.expanduser(config_file) config = _load_config(config_file) default_section = config.default_section # resolve profile if not profile: existing = config.sections() if default_section in config: # not included in sections existing.insert(0, default_section) if config_file_exists: click.echo(f"Available profiles: {', '.join(existing)}") default_profile = next(iter(existing)) _note = " (select existing or create new)" if config_file_exists else "" profile = default_text_input(f"Profile{_note}", default_profile) verb = "Updating existing" if profile in config else "Creating new" click.echo(f"{verb} profile: {profile}") if profile != default_section and not config.has_section(profile): config.add_section(profile) _input_config_variables(config, profile, prompts) _write_config(config, config_file) click.echo("Configuration saved.")
def create(config_file, profile): """Create and/or update cloud client configuration file.""" # determine the config file path if config_file: click.echo("Using configuration file: {}".format(config_file)) else: # path not given, try to detect; or use default, but allow user to override config_file = get_configfile_path() if config_file: click.echo( "Found existing configuration file: {}".format(config_file)) else: config_file = get_default_configfile_path() click.echo( "Configuration file not found; the default location is: {}". format(config_file)) config_file = default_text_input("Configuration file path", config_file) config_file = os.path.expanduser(config_file) # create config_file path config_base = os.path.dirname(config_file) if config_base and not os.path.exists(config_base): if click.confirm("Configuration file path does not exist. Create it?", abort=True): try: os.makedirs(config_base) except Exception as e: click.echo("Error creating configuration path: {}".format(e)) return 1 # try loading existing config, or use defaults try: config = load_config_from_files([config_file]) except: config = get_default_config() # determine profile if profile: click.echo("Using profile: {}".format(profile)) else: existing = config.sections() if existing: profiles = 'create new or choose from: {}'.format( ', '.join(existing)) default_profile = '' else: profiles = 'create new' default_profile = 'prod' profile = default_text_input("Profile (%s)" % profiles, default_profile, optional=False) if not config.has_section(profile): config.add_section(profile) # fill out the profile variables variables = 'endpoint token client solver proxy'.split() prompts = [ 'API endpoint URL', 'Authentication token', 'Default client class (qpu or sw)', 'Default solver' ] for var, prompt in zip(variables, prompts): default_val = config.get(profile, var, fallback=None) val = default_text_input(prompt, default_val) if val: val = os.path.expandvars(val) if val != default_val: config.set(profile, var, val) try: with open(config_file, 'w') as fp: config.write(fp) except Exception as e: click.echo("Error writing to configuration file: {}".format(e)) return 2 click.echo("Configuration saved.") return 0