Standardize save location

Changes to make --save-location standard for all commands

Change-Id: I86a2da01ad1cc1c4d708131b5161182e16b5bb5e
This commit is contained in:
Ryan Schroder 2020-01-06 14:19:27 -06:00 committed by Schroder, Ryan (rs530b)
parent 3e1859010b
commit 4cbc708c1d
4 changed files with 83 additions and 72 deletions

View File

@ -292,9 +292,9 @@ List
List known sites. List known sites.
**-o / \\-\\-output** (Optional, Default=stdout). **-s / \\-\\-save-location** (Optional, Default=stdout).
Where to output. Location where the output is saved.
:: ::
@ -307,7 +307,7 @@ Example:
:: ::
./pegleg site -r /opt/site-manifests list -o /workspace ./pegleg site -r /opt/site-manifests list -s /workspace
Show Show
---- ----
@ -318,9 +318,9 @@ Show details for one site.
Name of site. Name of site.
**-o / \\-\\-output** (Optional, Default=stdout). **-s / \\-\\-save-location** (Optional, Default=stdout).
Where to output. Location where the output is saved.
:: ::
@ -333,7 +333,7 @@ Example:
:: ::
./pegleg site -r /opt/site-manifests show site_name -o /workspace ./pegleg site -r /opt/site-manifests show site_name -s /workspace
Render Render
------ ------
@ -344,9 +344,9 @@ Render documents via `Deckhand`_ for one site.
Name of site. Name of site.
**-o / \\-\\-output** (Optional, Default=stdout). **-s / \\-\\-save-location** (Optional, Default=stdout).
Where to output. Location where the output is saved.
**-v / \\-\\-validate** (Optional, Default=True). **-v / \\-\\-validate** (Optional, Default=True).
@ -365,7 +365,7 @@ Example:
:: ::
./pegleg site -r /opt/site-manifests render site_name -o output ./pegleg site -r /opt/site-manifests render site_name -s save_location
.. _cli-site-lint: .. _cli-site-lint:
@ -774,10 +774,10 @@ but should be provided.
The relative path to the file to be wrapped. The relative path to the file to be wrapped.
**-o / \\-\\-output-path** **\\-\\-save-location**
The output path for the wrapped file. (default: input path with the extension The output path where the wrapped file is saved. (default: input path with the
replaced with .yaml) extension replaced with .yaml)
**-s / \\-\\-schema** **-s / \\-\\-schema**
@ -802,9 +802,8 @@ Examples
./pegleg.sh site -r /home/myuser/myrepo \ ./pegleg.sh site -r /home/myuser/myrepo \
secrets wrap -a myuser --filename secrets/certificates/new_cert.crt \ secrets wrap -a myuser --filename secrets/certificates/new_cert.crt \
-o secrets/certificates/new_cert.yaml -s "deckhand/Certificate/v1" \ --save-location secrets/certificates/new_cert.yaml \
-n "new-cert" -l site mysite -s "deckhand/Certificate/v1" -n "new-cert" -l site mysite
genesis_bundle genesis_bundle
-------------- --------------
@ -914,6 +913,14 @@ Minimum=0, no maximum. Values less than 0 will raise an exception.
NOTE: A generated certificate where days = 0 should only be used for testing. NOTE: A generated certificate where days = 0 should only be used for testing.
A certificate generated in such a way will be valid for 0 seconds. A certificate generated in such a way will be valid for 0 seconds.
**-s / \\-\\-save-location**
Directory to store the generated site certificates in. It will be created
automatically, if it does not already exist. The generated, wrapped, and
encrypted passphrases files will be saved in:
<save_location>/site/<site_name>/secrets/certificates/ directory. Defaults to
site repository path if no value given.'
**\\-\\-regenerate-all** (Optional, Default=False). **\\-\\-regenerate-all** (Optional, Default=False).
Force Pegleg to regenerate all PKI items. Force Pegleg to regenerate all PKI items.
@ -928,6 +935,7 @@ Examples
<site_name> \ <site_name> \
-a <author> \ -a <author> \
-d <days> \ -d <days> \
-s <save_location>
--regenerate-all --regenerate-all
passphrases passphrases

View File

@ -33,7 +33,7 @@ CONTEXT_SETTINGS = {
'--verbose', '--verbose',
is_flag=True, is_flag=True,
default=False, default=False,
help='Enable debug logging') help='Enable debug logging.')
@click.option( @click.option(
'-l', '-l',
'--logging-level', '--logging-level',
@ -57,7 +57,7 @@ def main(*, verbose, logging_level):
pegleg_main.set_logging_level(verbose, logging_level) pegleg_main.set_logging_level(verbose, logging_level)
@main.group(help='Commands related to repositories') @main.group(help='Commands related to repositories.')
@utils.MAIN_REPOSITORY_OPTION @utils.MAIN_REPOSITORY_OPTION
@utils.REPOSITORY_CLONE_PATH_OPTION @utils.REPOSITORY_CLONE_PATH_OPTION
# TODO(felipemonteiro): Support EXTRA_REPOSITORY_OPTION as well to be # TODO(felipemonteiro): Support EXTRA_REPOSITORY_OPTION as well to be
@ -77,7 +77,7 @@ def repo(*, site_repository, clone_path, repo_key, repo_username):
run_umask=True) run_umask=True)
@repo.command('lint', help='Lint all sites in a repository') @repo.command('lint', help='Lint all sites in a repository.')
@utils.ALLOW_MISSING_SUBSTITUTIONS_OPTION @utils.ALLOW_MISSING_SUBSTITUTIONS_OPTION
@utils.EXCLUDE_LINT_OPTION @utils.EXCLUDE_LINT_OPTION
@utils.WARN_LINT_OPTION @utils.WARN_LINT_OPTION
@ -92,7 +92,7 @@ def lint_repo(*, fail_on_missing_sub_src, exclude_lint, warn_lint):
click.echo(w) click.echo(w)
@main.group(help='Commands related to sites') @main.group(help='Commands related to sites.')
@utils.MAIN_REPOSITORY_OPTION @utils.MAIN_REPOSITORY_OPTION
@utils.REPOSITORY_CLONE_PATH_OPTION @utils.REPOSITORY_CLONE_PATH_OPTION
@utils.EXTRA_REPOSITORY_OPTION @utils.EXTRA_REPOSITORY_OPTION
@ -129,7 +129,7 @@ def site(
decrypt_repos=decrypt_repos) decrypt_repos=decrypt_repos)
@site.command(help='Output complete config for one site') @site.command(help='Output complete config for one site.')
@click.option( @click.option(
'-s', '-s',
'--save-location', '--save-location',
@ -163,21 +163,21 @@ def collect(*, save_location, validate, exclude_lint, warn_lint, site_name):
exclude_lint, save_location, site_name, validate, warn_lint) exclude_lint, save_location, site_name, validate, warn_lint)
@site.command('list', help='List known sites') @site.command('list', help='List known sites.')
@utils.OUTPUT_STREAM_OPTION @utils.SAVE_LOCATION_OPTION
def list_sites(*, output_stream): def list_sites(*, save_location):
pegleg_main.run_list_sites(output_stream) pegleg_main.run_list_sites(save_location)
@site.command(help='Show details for one site') @site.command(help='Show details for one site.')
@utils.OUTPUT_STREAM_OPTION @utils.SAVE_LOCATION_OPTION
@utils.SITE_REPOSITORY_ARGUMENT @utils.SITE_REPOSITORY_ARGUMENT
def show(*, output_stream, site_name): def show(*, save_location, site_name):
pegleg_main.run_show(output_stream, site_name) pegleg_main.run_show(save_location, site_name)
@site.command('render', help='Render a site through the deckhand engine') @site.command('render', help='Render a site through the deckhand engine.')
@utils.OUTPUT_STREAM_OPTION @utils.SAVE_LOCATION_OPTION
@click.option( @click.option(
'-v', '-v',
'--validate', '--validate',
@ -189,11 +189,11 @@ def show(*, output_stream, site_name):
'Skips over externally registered DataSchema documents to avoid ' 'Skips over externally registered DataSchema documents to avoid '
'false positives.') 'false positives.')
@utils.SITE_REPOSITORY_ARGUMENT @utils.SITE_REPOSITORY_ARGUMENT
def render(*, output_stream, site_name, validate): def render(*, save_location, site_name, validate):
pegleg_main.run_render(output_stream, site_name, validate) pegleg_main.run_render(save_location, site_name, validate)
@site.command('lint', help='Lint a given site in a repository') @site.command('lint', help='Lint a given site in a repository.')
@utils.ALLOW_MISSING_SUBSTITUTIONS_OPTION @utils.ALLOW_MISSING_SUBSTITUTIONS_OPTION
@utils.EXCLUDE_LINT_OPTION @utils.EXCLUDE_LINT_OPTION
@utils.WARN_LINT_OPTION @utils.WARN_LINT_OPTION
@ -210,7 +210,7 @@ def lint_site(*, fail_on_missing_sub_src, exclude_lint, warn_lint, site_name):
click.echo(w) click.echo(w)
@site.command('upload', help='Upload documents to Shipyard') @site.command('upload', help='Upload documents to Shipyard.')
# Keystone authentication parameters # Keystone authentication parameters
@click.option('--os-domain-name', envvar='OS_DOMAIN_NAME', required=False) @click.option('--os-domain-name', envvar='OS_DOMAIN_NAME', required=False)
@click.option( @click.option(
@ -233,7 +233,7 @@ def lint_site(*, fail_on_missing_sub_src, exclude_lint, warn_lint, site_name):
'--context-marker', '--context-marker',
help='Specifies a UUID (8-4-4-4-12 format) that will be used to correlate ' help='Specifies a UUID (8-4-4-4-12 format) that will be used to correlate '
'logs, transactions, etc. in downstream activities triggered by this ' 'logs, transactions, etc. in downstream activities triggered by this '
'interaction ', 'interaction.',
required=False, required=False,
type=click.UUID) type=click.UUID)
@click.option( @click.option(
@ -269,7 +269,7 @@ def upload(
click.echo(resp) click.echo(resp)
@site.group(name='secrets', help='Commands to manage site secrets documents') @site.group(name='secrets', help='Commands to manage site secrets documents.')
def secrets(): def secrets():
pass pass
@ -332,23 +332,22 @@ def generate_pki_deprecated(site_name, author, days, regenerate_all):
'filename', 'filename',
help='The relative file path for the file to be wrapped.') help='The relative file path for the file to be wrapped.')
@click.option( @click.option(
'-o', '--save-location',
'--output-path', 'save_location',
'output_path',
required=False, required=False,
help='The output path for the wrapped file. (default: input path with ' help='The output path where the wrapped file is saved. (default: input '
'.yaml)') 'path with .yaml).')
@click.option( @click.option(
'-s', '-s',
'--schema', '--schema',
'schema', 'schema',
help='The schema for the document to be wrapped, e.g. ' help='The schema for the document to be wrapped, e.g. '
'deckhand/Certificate/v1') 'deckhand/Certificate/v1.')
@click.option( @click.option(
'-n', '-n',
'--name', '--name',
'name', 'name',
help='The name for the document to be wrapped, e.g. new-cert') help='The name for the document to be wrapped, e.g. new-cert.')
@click.option( @click.option(
'-l', '-l',
'--layer', '--layer',
@ -363,11 +362,12 @@ def generate_pki_deprecated(site_name, author, days, regenerate_all):
help='Whether to encrypt the wrapped file.') help='Whether to encrypt the wrapped file.')
@utils.SITE_REPOSITORY_ARGUMENT @utils.SITE_REPOSITORY_ARGUMENT
def wrap_secret_cli( def wrap_secret_cli(
*, site_name, author, filename, output_path, schema, name, layer, *, site_name, author, filename, save_location, schema, name, layer,
encrypt): encrypt):
"""Wrap a bare secrets file in a YAML and ManagedDocument""" """Wrap a bare secrets file in a YAML and ManagedDocument"""
pegleg_main.run_wrap_secret( pegleg_main.run_wrap_secret(
author, encrypt, filename, layer, name, output_path, schema, site_name) author, encrypt, filename, layer, name, save_location, schema,
site_name)
@site.command( @site.command(
@ -419,7 +419,7 @@ def check_pki_certs(site_name, days):
exit(0) exit(0)
@main.group(help='Commands related to types') @main.group(help='Commands related to types.')
@utils.MAIN_REPOSITORY_OPTION @utils.MAIN_REPOSITORY_OPTION
@utils.REPOSITORY_CLONE_PATH_OPTION @utils.REPOSITORY_CLONE_PATH_OPTION
@utils.EXTRA_REPOSITORY_OPTION @utils.EXTRA_REPOSITORY_OPTION
@ -442,11 +442,11 @@ def type(
run_umask=False) run_umask=False)
@type.command('list', help='List known types') @type.command('list', help='List known types.')
@utils.OUTPUT_STREAM_OPTION @utils.SAVE_LOCATION_OPTION
def list_types(*, output_stream): def list_types(*, save_location):
"""List type names for a given repository.""" """List type names for a given repository."""
pegleg_main.run_list_types(output_stream) pegleg_main.run_list_types(save_location)
@secrets.group( @secrets.group(
@ -507,7 +507,7 @@ def generate_pki(site_name, author, days, regenerate_all, save_location):
click.echo("Generated PKI files written to:\n%s" % '\n'.join(output_paths)) click.echo("Generated PKI files written to:\n%s" % '\n'.join(output_paths))
@generate.command('passphrases', help='Command to generate site passphrases') @generate.command('passphrases', help='Command to generate site passphrases.')
@utils.SITE_REPOSITORY_ARGUMENT @utils.SITE_REPOSITORY_ARGUMENT
@click.option( @click.option(
'-s', '-s',
@ -525,7 +525,7 @@ def generate_pki(site_name, author, days, regenerate_all, save_location):
'author', 'author',
required=True, required=True,
help='Identifier for the program or person who is generating the secrets ' help='Identifier for the program or person who is generating the secrets '
'documents') 'documents.')
@click.option( @click.option(
'-c', '-c',
'--passphrase-catalog', '--passphrase-catalog',
@ -541,7 +541,7 @@ def generate_pki(site_name, author, days, regenerate_all, save_location):
'interactive', 'interactive',
is_flag=True, is_flag=True,
default=False, default=False,
help='Enables input prompts for "prompt: true" passphrases') help='Enables input prompts for "prompt: true" passphrases.')
@click.option( @click.option(
'--force-cleartext', '--force-cleartext',
'force_cleartext', 'force_cleartext',
@ -579,14 +579,14 @@ def generate_passphrases(
help='Directory to output the encrypted site secrets files. Created ' help='Directory to output the encrypted site secrets files. Created '
'automatically if it does not already exist. ' 'automatically if it does not already exist. '
'If save_location is not provided, the output encrypted files will ' 'If save_location is not provided, the output encrypted files will '
'overwrite the original input files (default behavior)') 'overwrite the original input files (default behavior).')
@click.option( @click.option(
'-a', '-a',
'--author', '--author',
'author', 'author',
required=True, required=True,
help='Identifier for the program or person who is encrypting the secrets ' help='Identifier for the program or person who is encrypting the secrets '
'documents') 'documents.')
@utils.SITE_REPOSITORY_ARGUMENT @utils.SITE_REPOSITORY_ARGUMENT
def encrypt(*, path, save_location, author, site_name): def encrypt(*, path, save_location, author, site_name):
pegleg_main.run_encrypt(author, save_location, site_name, path=path) pegleg_main.run_encrypt(author, save_location, site_name, path=path)
@ -626,14 +626,14 @@ def decrypt(*, path, save_location, overwrite, site_name):
click.echo(d) click.echo(d)
@main.group(help='Miscellaneous generate commands') @main.group(help='Miscellaneous generate commands.')
def generate(): def generate():
pass pass
@generate.command( @generate.command(
'passphrase', 'passphrase',
help='Command to generate a passphrase and print out to stdout') help='Command to generate a passphrase and print out to stdout.')
@click.option( @click.option(
'-l', '-l',
'--length', '--length',
@ -649,7 +649,7 @@ def generate_passphrase(length):
@generate.command( @generate.command(
'salt', help='Command to generate a salt and print out to stdout') 'salt', help='Command to generate a salt and print out to stdout.')
@click.option( @click.option(
'-l', '-l',
'--length', '--length',

View File

@ -89,8 +89,11 @@ MAIN_REPOSITORY_OPTION = click.option(
help='Path or URL to the primary repository (containing ' help='Path or URL to the primary repository (containing '
'site_definition.yaml) repo.') 'site_definition.yaml) repo.')
OUTPUT_STREAM_OPTION = click.option( SAVE_LOCATION_OPTION = click.option(
'-o', '--output', 'output_stream', help='Where to output.') '-s',
'--save-location',
'save_location',
help='Where to save the output. Defaults to stdout.')
REPOSITORY_CLONE_PATH_OPTION = click.option( REPOSITORY_CLONE_PATH_OPTION = click.option(
'-p', '-p',
@ -105,7 +108,7 @@ REPOSITORY_CLONE_PATH_OPTION = click.option(
'name is airship/treasuremap and the clone path is ' 'name is airship/treasuremap and the clone path is '
'/tmp/mypath then the following directory is ' '/tmp/mypath then the following directory is '
'created /tmp/mypath/airship/treasuremap ' 'created /tmp/mypath/airship/treasuremap '
'which will contain the contents of the repo') 'which will contain the contents of the repo.')
REPOSITORY_KEY_OPTION = click.option( REPOSITORY_KEY_OPTION = click.option(
'-k', '-k',

View File

@ -284,7 +284,7 @@ class TestSiteCliActions(BaseCLIActionTest):
mock_output = os.path.join(tmpdir, 'output') mock_output = os.path.join(tmpdir, 'output')
result = self.runner.invoke( result = self.runner.invoke(
commands.site, [ commands.site, [
'--no-decrypt', '-r', repo_path_or_url, 'list', '-o', '--no-decrypt', '-r', repo_path_or_url, 'list', '-s',
mock_output mock_output
]) ])
@ -321,7 +321,7 @@ class TestSiteCliActions(BaseCLIActionTest):
result = self.runner.invoke( result = self.runner.invoke(
commands.site, [ commands.site, [
'--no-decrypt', '-r', repo_path_or_url, 'show', self.site_name, '--no-decrypt', '-r', repo_path_or_url, 'show', self.site_name,
'-o', mock_output '-s', mock_output
]) ])
assert result.exit_code == 0, result.output assert result.exit_code == 0, result.output
@ -713,7 +713,7 @@ class TestSiteSecretsActions(BaseCLIActionTest):
file_dir = os.path.join( file_dir = os.path.join(
repo_path, "site", "seaworthy", "secrets", "certificates") repo_path, "site", "seaworthy", "secrets", "certificates")
file_path = os.path.join(file_dir, "test.crt") file_path = os.path.join(file_dir, "test.crt")
output_path = os.path.join(file_dir, "test.yaml") save_location = os.path.join(file_dir, "test.yaml")
with open(file_path, "w") as test_crt_fi: with open(file_path, "w") as test_crt_fi:
test_crt_fi.write(TEST_CERT) test_crt_fi.write(TEST_CERT)
@ -726,7 +726,7 @@ class TestSiteSecretsActions(BaseCLIActionTest):
commands.site, ['--no-decrypt', "-r", repo_path] + secrets_opts) commands.site, ['--no-decrypt', "-r", repo_path] + secrets_opts)
assert result.exit_code == 0 assert result.exit_code == 0
with open(output_path, "r") as output_fi: with open(save_location, "r") as output_fi:
doc = yaml.safe_load(output_fi) doc = yaml.safe_load(output_fi)
assert doc["data"]["managedDocument"]["data"] == TEST_CERT assert doc["data"]["managedDocument"]["data"] == TEST_CERT
assert doc["data"]["managedDocument"][ assert doc["data"]["managedDocument"][
@ -738,17 +738,17 @@ class TestSiteSecretsActions(BaseCLIActionTest):
assert doc["data"]["managedDocument"]["metadata"][ assert doc["data"]["managedDocument"]["metadata"][
"storagePolicy"] == "cleartext" "storagePolicy"] == "cleartext"
os.remove(output_path) os.remove(save_location)
secrets_opts = [ secrets_opts = [
'secrets', 'wrap', "-a", "lm734y", "--filename", file_path, "-o", 'secrets', 'wrap', "-a", "lm734y", "--filename", file_path,
output_path, "-s", "deckhand/Certificate/v1", "-n", "--save-location", save_location, "-s", "deckhand/Certificate/v1",
"test-certificate", "-l", "site", self.site_name "-n", "test-certificate", "-l", "site", self.site_name
] ]
result = self.runner.invoke( result = self.runner.invoke(
commands.site, ['--no-decrypt', "-r", repo_path] + secrets_opts) commands.site, ['--no-decrypt', "-r", repo_path] + secrets_opts)
assert result.exit_code == 0 assert result.exit_code == 0
with open(output_path, "r") as output_fi: with open(save_location, "r") as output_fi:
doc = yaml.safe_load(output_fi) doc = yaml.safe_load(output_fi)
assert "encrypted" in doc["data"] assert "encrypted" in doc["data"]
assert "managedDocument" in doc["data"] assert "managedDocument" in doc["data"]
@ -766,7 +766,7 @@ class TestTypeCliActions(BaseCLIActionTest):
def _validate_type_list_action(self, repo_path_or_url, tmpdir): def _validate_type_list_action(self, repo_path_or_url, tmpdir):
mock_output = os.path.join(tmpdir, 'output') mock_output = os.path.join(tmpdir, 'output')
result = self.runner.invoke( result = self.runner.invoke(
commands.type, ['-r', repo_path_or_url, 'list', '-o', mock_output]) commands.type, ['-r', repo_path_or_url, 'list', '-s', mock_output])
with open(mock_output, 'r') as f: with open(mock_output, 'r') as f:
table_output = f.read() table_output = f.read()
@ -806,7 +806,7 @@ class TestSiteCliActionsWithSubdirectory(BaseCLIActionTest):
mock_output = os.path.join(tmpdir, 'output') mock_output = os.path.join(tmpdir, 'output')
result = self.runner.invoke( result = self.runner.invoke(
commands.site, [ commands.site, [
'--no-decrypt', '-r', repo_path_or_url, 'list', '-o', '--no-decrypt', '-r', repo_path_or_url, 'list', '-s',
mock_output mock_output
]) ])