-
Notifications
You must be signed in to change notification settings - Fork 9
/
__main__.py
149 lines (128 loc) · 5.81 KB
/
__main__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/python
#
# Copyright 2021 Google LLC
#
# 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 click
import configparser
import os
import logging
from functools import wraps
from lmanage.capturator.looker_api_reader import LookerApiReader
from lmanage.capturator.looker_config_saver import LookerConfigSaver
from lmanage.configurator.looker_config_reader import LookerConfigReader
from lmanage.configurator.looker_provisioner import LookerProvisioner
from lmanage.mapview import mapview_execute
from lmanage.utils import logger_creation as log_color
logger = logging.getLogger(__name__)
@click.group()
@click.version_option()
def lmanage():
pass
def log_args(**kwargs):
log_level = kwargs.get('verbose', False)
logger = log_color.init_logger(__name__, testing_mode=log_level)
for k, v in kwargs.items():
if {v} != None:
logger.info(
f'You have set {v} for your {k} variable')
else:
logger.debug(
f'There is no value set for {k} please use the `--help` flag to see input parameters.')
def clean_args(**kwargs):
kwargs['config_dir'] = kwargs['config_dir'].rstrip('/')
return kwargs
def common_options(f):
@click.option('-i', '--ini-file',
help='Specify API Credentials in an ini file, if no path is given program will assume these values are set as environmental variables as denoted at https://github.com/looker-open-source/sdk-codegen#environment-variable-configuration.')
@click.option('-cd', '--config-dir',
help='Where to save the YAML files to use for instance configuration.', required=True)
@click.option('-v', '--verbose',
is_flag=True,
help='Add this flag to get a more verbose version of the returned stout text.')
@click.option('-f', '--force',
is_flag=True,
help='Add this flag to skip confirmation prompt for capturing and configuring instance.')
@click.pass_context
@wraps(f)
def decorated_function(ctx, *args, **kwargs):
log_args(**kwargs)
kwargs = clean_args(**kwargs)
return ctx.invoke(f, *args, **kwargs)
return decorated_function
@lmanage.command()
@common_options
def capturator(**kwargs):
"""Captures security settings for your looker instance"""
ini_file, config_dir, verbose, force = kwargs.get('ini_file'), kwargs.get(
'config_dir'), kwargs.get('verbose'), kwargs.get('force')
try:
target_url = get_target_url(ini_file)
if force or (not force and click.confirm(f'\nYou are about to capture settings and content from instance {target_url}. Proceed?')):
config = LookerApiReader(ini_file).get_config()
LookerConfigSaver(config_dir).save(config)
except RuntimeError as e:
print(e)
@lmanage.command()
@common_options
def configurator(**kwargs):
"""Configures security settings for your looker instance"""
ini_file, config_dir, verbose, force = kwargs.get('ini_file'), kwargs.get(
'config_dir'), kwargs.get('verbose'), kwargs.get('force')
try:
target_url = get_target_url(ini_file)
config_reader = LookerConfigReader(config_dir)
config_reader.read()
summary = config_reader.get_summary()
if force or (not force and click.confirm(f'\nYou are about configure instance {target_url} with:\n{summary}\nAre you sure you want to proceed?')):
LookerProvisioner(ini_file).provision(config_reader.config)
except RuntimeError as e:
print(e)
def get_target_url(ini_file):
if ini_file:
config_parser = configparser.ConfigParser()
successful_read = config_parser.read(ini_file)
if not successful_read:
raise FileNotFoundError(
f'Configuration file "{ini_file}" not found.')
sections = config_parser.sections()
return config_parser.get(sections[0], 'base_url')
else:
target_url = os.getenv('LOOKERSDK_BASE_URL')
if target_url is None:
raise ValueError(
'LOOKERSDK_BASE_URL environment variable not set.')
@lmanage.command()
@click.option("-op", "--output_path",
help="input your file path to save a tabbed xls of results")
@ click.option("-i", "--ini-file",
help="Path to the ini file to use for sdk authentication")
@ click.option("-lfp", "--lookml_file_path",
help="Path folder containing your lookml files, often taken using a git pull from lmanage.your connected lookml project repository")
@ click.option("-t", "--table",
help="**OPTIONAL** Add a view name to search for elements that rely on this view")
@ click.option("-f", "--field",
help="**OPTIONAL** Add a fully scoped fieldname (e.g. view_name.field_name) to return a csv with these values")
@ click.option("-l", "--level",
default='INFO',
help="**OPTIONAL** Add the value 'DEBUG' to get a more verbose version of the returned stout text")
def mapview(**kwargs):
level = kwargs.get('level', 'INFO')
for k, v in kwargs.items():
if {v} != None:
logger.info(
f'You have set {v} for your {k} variable')
else:
logger.debug(
f'There is no value set for {k} please use the `--help` flag to see input parameters')
mapview_execute.main(**kwargs)