Skip to content
This repository was archived by the owner on Mar 6, 2024. It is now read-only.

Commit b67df4c

Browse files
author
Nikola Vladimirov Iliev
committed
Add ui extensions commands
Following commads are added: generate, list, deploy, delete. They will help the user to manage his ui extensions. Prompt and PromptLauncher classes are build on top of python click lib to give the ability to validate and collect the data from the user. Signed-off-by: Nikola Vladimirov Iliev <nvladimirovi@vmware.com>
1 parent bbef5ad commit b67df4c

File tree

10 files changed

+516
-0
lines changed

10 files changed

+516
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ docs/_build/
6060
target/
6161

6262
.idea/
63+
.vscode/
6364

6465
docs/.bundle
6566
docs/_site

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ python:
66
install:
77
- pip install git+https://github.com/vmware/pyvcloud.git
88
- pip install -r requirements.txt
9+
- pip install -e .
910
- python setup.py install
1011
- pip install tox
1112

tests/run-tests.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ D=`dirname $0`
66
$D/tenant-onboard.sh
77
$D/tenant-operations.sh
88
$D/cleanup.sh
9+
$D/ui-ext-test.sh

tests/ui-ext-test.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
VCD="C:\Users\nvladimirovi\AppData\Roaming\Python\Python36\Scripts\vcd.exe"
6+
VCD_UI_EXT_ABS_PATH=D:/test-py-cli/ui_plugin
7+
VCD_HOST=bos1-vcd-sp-static-198-58.eng.vmware.com
8+
VCD_ORG=System
9+
VCD_USER=administrator
10+
VCD_PASSWORD='********'
11+
12+
# $VCD login $VCD_HOST $VCD_ORG $VCD_USER --password $VCD_PASSWORD
13+
14+
$VCD version
15+
16+
echo 'This should deploy ui extension'
17+
$VCD uiext deploy --path $VCD_UI_EXT_ABS_PATH -p -pr
18+
echo 'This should list all ui extensions'
19+
$VCD uiext list
20+
echo 'This should delete ui extension by user choice'
21+
$VCD uiext delete

utilities/colors.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from enum import Enum
2+
3+
Colors = Enum('Colors', {
4+
'HEADER': '\033[95m',
5+
'OKBLUE': '\033[94m',
6+
'OKGREEN': '\033[92m',
7+
'WARNING': '\033[93m',
8+
'FAIL': '\033[91m',
9+
'ENDC': '\033[0m',
10+
'BOLD': '\033[1m',
11+
'UNDERLINE': '\033[4m'
12+
})
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from utilities.prompt_launcher.prompt_launcher import PromptLauncher
2+
from utilities.prompt_launcher.prompt import Prompt
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
class Prompt:
2+
"""Represent abstraction of python click
3+
propmt data.
4+
"""
5+
def __init__(self, name, type, message=None, default=None, validator=None,
6+
err_message=None):
7+
self.name = name
8+
self.type = type
9+
self.message = message
10+
self.default = default
11+
self.validator = validator
12+
self.error_message = err_message
13+
14+
@property
15+
def name(self):
16+
"""Getter for name property.
17+
Returns
18+
-------
19+
name : str
20+
name value
21+
"""
22+
return self._name
23+
24+
@name.setter
25+
def name(self, name):
26+
"""Setter for name property.
27+
Parameters
28+
----------
29+
name : str
30+
Defines the name value
31+
"""
32+
33+
if len(name) < 1:
34+
raise Exception("""The name property can not be
35+
with lenght less ten 1.""")
36+
37+
self._name = name
38+
39+
@property
40+
def type(self):
41+
"""Getter for type property.
42+
Returns
43+
-------
44+
type | str
45+
type value
46+
"""
47+
return self._type
48+
49+
@type.setter
50+
def type(self, type):
51+
"""Setter for type property.
52+
Parameters
53+
----------
54+
type : str
55+
Defines the name value
56+
"""
57+
58+
self._type = type
59+
60+
@property
61+
def message(self):
62+
"""Getter for message property.
63+
Returns
64+
-------
65+
message | str
66+
message value
67+
"""
68+
69+
return self._message
70+
71+
@message.setter
72+
def message(self, message=None):
73+
"""Setter for message property.
74+
Parameters
75+
----------
76+
message : str
77+
Defines the message value
78+
"""
79+
80+
if type(message) is not str:
81+
raise Exception("The message property has to be string")
82+
83+
self._message = message
84+
85+
@property
86+
def default(self):
87+
"""Getter for default property.
88+
Returns
89+
-------
90+
default | any
91+
default value
92+
"""
93+
94+
return self._default
95+
96+
@default.setter
97+
def default(self, default):
98+
"""Setter for default property.
99+
Parameters
100+
----------
101+
default : any
102+
Defines the message value
103+
"""
104+
105+
self._default = default
106+
107+
@property
108+
def validator(self):
109+
"""Getter for validator property.
110+
Returns
111+
-------
112+
validator | Validator / Validator[]
113+
validator value
114+
"""
115+
116+
return self._validator
117+
118+
@validator.setter
119+
def validator(self, validator):
120+
"""Setter for validator property.
121+
Parameters
122+
----------
123+
validator : Validator | Validator[]
124+
Defines the validator value
125+
"""
126+
127+
self._validator = validator
128+
129+
@property
130+
def error_message(self):
131+
"""Getter for error_message property.
132+
Returns
133+
-------
134+
error_message | boolean
135+
error_message value
136+
"""
137+
return self._error_message
138+
139+
@error_message.setter
140+
def error_message(self, err_message):
141+
"""Setter for error_message property.
142+
Parameters
143+
----------
144+
error_message : boolean
145+
Defines the error_message value
146+
"""
147+
148+
if err_message is not None:
149+
self._error_message = err_message
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import click
2+
3+
from utilities.colors import Colors
4+
5+
6+
class PromptLauncher:
7+
"""Collect and execute prompt objects.
8+
"""
9+
def __init__(self, prompts=[]):
10+
"""Constructs the PromptLauncher object.
11+
Paramenters
12+
-------
13+
prompts | Prompt
14+
15+
click | Click ( lib for python CLI )
16+
17+
Returns
18+
-------
19+
None
20+
"""
21+
self._prompts = prompts
22+
23+
def add(self, propmts):
24+
"""Add new items to dict with concat
25+
Returns
26+
-------
27+
None
28+
"""
29+
30+
self._prompts = self._prompts + propmts
31+
32+
def pop_prompt(self):
33+
"""Pop the first element from the prompts list.
34+
Returns
35+
-------
36+
prompt | Prompt
37+
prompt value
38+
"""
39+
return self._prompts.pop(0)
40+
41+
def recuresive_prompt(self, prompt, valuedict):
42+
return self.prompt(prompt, valuedict)
43+
44+
def prompt(self, prompt, valuedict={}):
45+
"""Execute given prompt object.
46+
Returns
47+
-------
48+
valuedict | Dictionary
49+
valuedict value
50+
"""
51+
52+
if prompt.validator:
53+
value = None
54+
55+
err_msg = prompt.error_message
56+
fail_clr = Colors['FAIL'].value
57+
reset_clr = Colors['ENDC'].value
58+
59+
if type(prompt.validator) is list:
60+
userInput = click.prompt(
61+
prompt._message,
62+
type=prompt.type,
63+
default=prompt.default
64+
)
65+
66+
for validator in prompt.validator:
67+
validator_return = validator.validate(userInput)
68+
69+
if validator_return is None:
70+
print(Colors['FAIL'].value + err_msg + reset_clr)
71+
return self.recuresive_prompt(prompt, valuedict)
72+
73+
value = validator_return
74+
else:
75+
value = prompt.validator.validate(input=click.prompt(
76+
prompt._message,
77+
type=prompt.type,
78+
default=prompt.default))
79+
if value is not None:
80+
valuedict[prompt.name] = value
81+
else:
82+
print(fail_clr + err_msg + reset_clr)
83+
return self.recuresive_prompt(prompt, valuedict)
84+
else:
85+
valuedict[prompt.name] = click.prompt(
86+
prompt._message,
87+
type=prompt.type,
88+
default=prompt.default,
89+
)
90+
91+
return valuedict
92+
93+
def multi_prompt(self):
94+
"""Prompt the user with questions.
95+
Returns
96+
-------
97+
thisdict | Dictionary
98+
thisdict value
99+
"""
100+
thisdict = {}
101+
102+
while len(self._prompts) > 0:
103+
prompt = self._prompts.pop(0)
104+
thisdict = self.prompt(prompt, thisdict)
105+
return thisdict

0 commit comments

Comments
 (0)