hcs-cli 0.1.319__py3-none-any.whl → 0.1.321__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
hcs_cli/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = "0.1.319"
1
+ __version__ = "0.1.321"
2
2
 
3
- from . import service
3
+ from . import service as service # noqa: F401
@@ -13,12 +13,14 @@ See the License for the specific language governing permissions and
13
13
  limitations under the License.
14
14
  """
15
15
 
16
+ import os
16
17
  import click
17
18
 
18
19
  import hcs_cli.cmds.dev.util.log as log
19
20
  from hcs_cli.cmds.dev.fs.helper.util import validate_fs_kubeconfig, validate_fs_profile
20
21
  from hcs_cli.cmds.dev.fs.init import _resolve_bundled_file_path
21
22
  from hcs_cli.support.exec_util import run_cli
23
+ from hcs_core.ctxp import profile
22
24
 
23
25
 
24
26
  @click.command()
@@ -42,6 +44,7 @@ def clear(only_default: bool, **kwargs):
42
44
  if not only_default:
43
45
  _delete_all()
44
46
 
47
+ os.environ["ORG_ID"] = profile.current().csp.orgId
45
48
  akka_plan_path = _resolve_bundled_file_path("provided_files/akka.plan.yml")
46
49
  azure_plan_path = _resolve_bundled_file_path("provided_files/azure.plan.yml")
47
50
  azsim_plan_path = _resolve_bundled_file_path("provided_files/azsim.plan.yml")
@@ -90,3 +93,8 @@ def _delete_all():
90
93
  provider_ids = run_cli("hcs provider list --ids", output_json=True)
91
94
  for pid in provider_ids:
92
95
  run_cli("hcs provider delete -y " + pid, raise_on_error=False)
96
+
97
+ # all lcm internal providers
98
+ lcm_provider_ids = run_cli("hcs lcm provider list --ids", output_json=True)
99
+ for lpid in lcm_provider_ids:
100
+ run_cli("hcs lcm provider delete " + lpid, raise_on_error=False)
@@ -75,7 +75,7 @@ stringData:
75
75
  JcSvTMU2HOuQ/q6vFZq3PRbvroMeXlw2WJrqO3vu04SZwYiP8dcrlHTXQJh+Mp9T
76
76
  mQ==
77
77
  -----END CERTIFICATE-----
78
- mqtt.ca-key: |-
78
+ mqtt.ca-key: |-
79
79
  -----BEGIN PRIVATE KEY-----
80
80
  MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDUNJx2Cf0noNHc
81
81
  DXB9AFPSFMkkpwxb0wtqaCLiB7v5zkF7CVBl5LnecVk7CM8bJY62H90Lv8Zv/2sl
@@ -104,7 +104,7 @@ stringData:
104
104
  boPQ+RK1VKj5UFkUKz5LiohLmCBEQ7sh1HBS2Vje8MFtg0P138sRlbMCvdAEARTZ
105
105
  uQfAKLns7QFf9W1C60AVAQ==
106
106
  -----END PRIVATE KEY-----
107
- mqtt.client-cert: |-
107
+ mqtt.client-cert: |-
108
108
  -----BEGIN CERTIFICATE-----
109
109
  MIIFKDCCAxCgAwIBAgIFALjj4O4wDQYJKoZIhvcNAQELBQAwdTELMAkGA1UEBhMC
110
110
  VVMxCzAJBgNVBAgMAkNBMR8wHQYDVQQKDBZIb3Jpem9uIENsb3VkIFNlcnZpY2Vz
@@ -204,7 +204,7 @@ stringData:
204
204
  JcSvTMU2HOuQ/q6vFZq3PRbvroMeXlw2WJrqO3vu04SZwYiP8dcrlHTXQJh+Mp9T
205
205
  mQ==
206
206
  -----END CERTIFICATE-----
207
- mqtt.client-key: |-
207
+ mqtt.client-key: |-
208
208
  -----BEGIN PRIVATE KEY-----
209
209
  MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC40aC4pyy0+++D
210
210
  kD1cPRsMWO4ANZ8L4LaaHcg/e/1NbiExd/QlZESNJnnIyD29qY1h9WGEVDHtInsl
@@ -0,0 +1,72 @@
1
+ import click
2
+ import datetime
3
+ import json
4
+ import time
5
+
6
+ from hcs_cli.service.hoc import diagnostic
7
+ from hcs_cli.service import tsctl
8
+
9
+
10
+ @click.command(name="stats-aggregate-connects")
11
+ @click.argument("from_", type=int)
12
+ @click.argument("to", type=int)
13
+ @click.option("--wait", type=bool, required=False, is_flag=True, default=False)
14
+ @click.option("--verbose", type=bool, required=False, is_flag=True, default=False)
15
+ def aggregate_connects(from_: int, to: int, wait: bool, verbose: bool):
16
+ """
17
+ Aggregate connect events between FROM_ and TO unix timestamps.
18
+ """
19
+ payload = {"from": from_, "to": to}
20
+ result = diagnostic.aggregateConnects(payload, verbose=verbose)
21
+ click.echo(result)
22
+
23
+ if not result:
24
+ return "", 1
25
+
26
+ if wait:
27
+ wait_for_task(result)
28
+
29
+
30
+ @click.command(name="stats-aggregate-connects-day-before")
31
+ @click.option("--wait", type=bool, required=False, is_flag=True, default=False)
32
+ @click.option("--verbose", type=bool, required=False, is_flag=True, default=False)
33
+ def aggregate_connects_day_before(wait: bool, verbose: bool):
34
+ dt = datetime.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
35
+ dt_2_days_ago = dt - datetime.timedelta(days=2)
36
+ dt_1_day_ago = dt - datetime.timedelta(days=1)
37
+
38
+ print(f"Aggregating connect events from {dt_2_days_ago} to {dt_1_day_ago}")
39
+ from_ = int(dt_2_days_ago.timestamp())
40
+ to = int(dt_1_day_ago.timestamp())
41
+ payload = {"from": from_, "to": to}
42
+ result = diagnostic.aggregateConnects(payload, verbose=verbose)
43
+ click.echo(result)
44
+ if not result:
45
+ return "", 1
46
+ if wait:
47
+ wait_for_task(result)
48
+
49
+
50
+ def wait_for_task(result: dict):
51
+ print("Waiting for task to complete...")
52
+ totalWaitTime = 0
53
+ while True:
54
+ time.sleep(10)
55
+ taskStatus = tsctl.task.lastlog(result.namespace, result.group, result.taskKey)
56
+ if "state" in taskStatus and taskStatus.state == "Error":
57
+ print(f"Task is in {taskStatus.state} state - {taskStatus.error} ")
58
+ print(json.dumps(taskStatus, indent=2))
59
+ break
60
+ if "state" in taskStatus and taskStatus.state == "Success":
61
+ print("Task completed successfully.")
62
+ print(json.dumps(taskStatus, indent=2))
63
+ break
64
+ if ("state" in taskStatus and taskStatus.state == "") or "state" not in taskStatus:
65
+ print("Task is still in progress...")
66
+ totalWaitTime += 10
67
+ if totalWaitTime >= 600:
68
+ print("Waited for 10 minutes, exiting.")
69
+ break
70
+ continue
71
+ print(json.dumps(taskStatus, indent=2))
72
+ break
@@ -0,0 +1,48 @@
1
+ """
2
+ Copyright 2023-2023 VMware Inc.
3
+ SPDX-License-Identifier: Apache-2.0
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+ """
15
+
16
+ import click
17
+ from hcs_core.ctxp import recent
18
+ import hcs_core.sglib.cli_options as cli
19
+
20
+ from hcs_cli.service import inventory
21
+ from hcs_cli.support.param_util import parse_vm_path
22
+
23
+
24
+ @click.command()
25
+ @cli.org_id
26
+ @click.argument("vm_path", type=str, required=False)
27
+ def delete(org: str, vm_path: str):
28
+ """Delete a VM by path, e.g., template1/vm1, or 'vm1,vm2,vm3'."""
29
+
30
+ org_id = cli.get_org_id(org)
31
+
32
+ if vm_path.find(",") > 0:
33
+ vm_ids = [v.strip() for v in vm_path.split(",")]
34
+ template_id = recent.require("template", None)
35
+ else:
36
+ template_id, vm_id = parse_vm_path(vm_path)
37
+ ret = inventory.get(template_id, vm_id, org_id)
38
+ if not ret:
39
+ return "", 1
40
+ vm_ids = [vm_id]
41
+
42
+ ret = {"_requested_ids": vm_ids, "_accepted_ids": [], "_deleted": 0}
43
+ vms = inventory.begin_deleting_vms_by_id(template_id, org_id, vm_ids)
44
+ for vm in vms:
45
+ ret["_accepted_ids"].append(vm["id"])
46
+ actual_deleted = inventory.finish_deleting_vms(template_id, org_id, vm_ids)
47
+ ret["_deleted"] = actual_deleted
48
+ return ret
@@ -63,6 +63,12 @@ from hcs_cli.support import constant
63
63
  required=False,
64
64
  help="",
65
65
  )
66
+ @click.option(
67
+ "--subscription-id",
68
+ type=str,
69
+ required=False,
70
+ help="",
71
+ )
66
72
  @click.option(
67
73
  "--file",
68
74
  "-f",
@@ -80,6 +86,7 @@ def create(
80
86
  client_id: str,
81
87
  client_secret: str,
82
88
  tenant_id: str,
89
+ subscription_id: str,
83
90
  file: str,
84
91
  org: str,
85
92
  **kwargs,
@@ -108,7 +115,7 @@ def create(
108
115
  "description": description,
109
116
  "credentialId": credential_id,
110
117
  }
111
- elif client_id or client_secret or tenant_id:
118
+ elif client_id or client_secret or tenant_id or subscription_id:
112
119
  if type != "AZURE":
113
120
  raise click.BadParameter("client-id is only supported for Azure provider.")
114
121
  if not client_id:
@@ -117,7 +124,8 @@ def create(
117
124
  raise click.BadParameter("client-secret is required for client-id.")
118
125
  if not tenant_id:
119
126
  raise click.BadParameter("tenant-id is required for Azure provider.")
120
-
127
+ if not subscription_id:
128
+ raise click.BadParameter("subscription-id is required for Azure provider.")
121
129
  data = {
122
130
  "id": id if id else _rand_id(8),
123
131
  "type": type,
@@ -126,6 +134,7 @@ def create(
126
134
  "description": description,
127
135
  "credentialId": credential_id,
128
136
  "tenantId": tenant_id,
137
+ "subscriptionId": subscription_id,
129
138
  "credentials": [
130
139
  {
131
140
  "clientId": client_id,
@@ -0,0 +1,46 @@
1
+ """
2
+ Copyright 2023-2023 VMware Inc.
3
+ SPDX-License-Identifier: Apache-2.0
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+ """
15
+
16
+ import click
17
+ import hcs_core.sglib.cli_options as cli
18
+
19
+ import hcs_cli.service.lcm as lcm
20
+ from hcs_cli.cmds.template.expand import expand_impl
21
+
22
+
23
+ @click.command(hidden=True)
24
+ @click.option(
25
+ "--number",
26
+ "-n",
27
+ type=int,
28
+ required=False,
29
+ default=0,
30
+ help="Number of VMs to expand. Use negative number to shrink.",
31
+ )
32
+ @click.option(
33
+ "--to",
34
+ "-t",
35
+ type=int,
36
+ required=False,
37
+ default=0,
38
+ help="Expected size of template.",
39
+ )
40
+ @click.argument("template_id", type=str, required=False)
41
+ @cli.org_id
42
+ @cli.wait
43
+ def expand(number: int, to: int, template_id: str, org: str, wait: str):
44
+ """Update an existing template"""
45
+
46
+ return expand_impl(number, to, template_id, org, wait, lcm)
@@ -24,8 +24,9 @@ from hcs_cli.support.param_util import parse_vm_path
24
24
  @click.argument("vm_path", type=str, required=False)
25
25
  @cli.org_id
26
26
  @cli.confirm
27
+ @cli.force
27
28
  @cli.wait
28
- def delete(vm_path: str, org: str, confirm: bool, wait: str, **kwargs):
29
+ def delete(vm_path: str, org: str, confirm: bool, force: bool, wait: str, **kwargs):
29
30
  """Delete VM"""
30
31
  template_id, vm_id = parse_vm_path(vm_path)
31
32
  org_id = cli.get_org_id(org)
@@ -37,7 +38,7 @@ def delete(vm_path: str, org: str, confirm: bool, wait: str, **kwargs):
37
38
  if not confirm:
38
39
  click.confirm(f"Delete VM {template_id}/{vm_id}?", abort=True)
39
40
 
40
- vm.delete(template_id, vm_id, org_id, **kwargs)
41
+ vm.delete(template_id, vm_id, org_id, force=force, **kwargs)
41
42
 
42
43
  if wait == "0":
43
44
  return
hcs_cli/cmds/task.py CHANGED
@@ -222,6 +222,7 @@ def use(namespace: str, group: str, smart_path: str, reset: bool, **kwargs):
222
222
  required=False,
223
223
  help="Filter tasks by state, for one-time tasks only. Comma separated values. E.g. Init,Running,Canceled,Error,Success",
224
224
  )
225
+ @click.option("--v1", is_flag=True, default=False, required=False, help="Use v1 task API.")
225
226
  @click.option("--v1log", is_flag=True, default=False, required=False, help="Fetch last log for v1 tasks.")
226
227
  @cli.limit
227
228
  @cli.search
@@ -27,39 +27,84 @@ import hcs_cli.service.admin as admin
27
27
  "-n",
28
28
  type=int,
29
29
  required=False,
30
- default=1,
30
+ default=0,
31
31
  help="Number of VMs to expand. Use negative number to shrink.",
32
32
  )
33
+ @click.option(
34
+ "--to",
35
+ "-t",
36
+ type=int,
37
+ required=False,
38
+ default=0,
39
+ help="Expected size of template.",
40
+ )
33
41
  @click.argument("template_id", type=str, required=False)
34
42
  @cli.org_id
35
43
  @cli.wait
36
- def expand(number: int, template_id: str, org: str, wait: str, **kwargs):
44
+ def expand(number: int, to: int, template_id: str, org: str, wait: str):
37
45
  """Update an existing template"""
46
+ return expand_impl(number, to, template_id, org, wait, admin)
47
+
48
+
49
+ def expand_impl(number: int, to: int, template_id: str, org: str, wait: str, service):
50
+ if to != 0 and number != 0:
51
+ return "Specify either --to or --number, not both.", 1
52
+ if to < 0:
53
+ return "--to must be non-negative.", 1
54
+ if to > 5000:
55
+ return "--to exceeds maximum limit of 5000.", 1
38
56
 
39
57
  org_id = cli.get_org_id(org)
40
58
 
41
59
  template_id = recent.require("template", template_id)
42
- template = admin.template.get(template_id, org_id)
60
+ template = service.template.get(template_id, org_id)
43
61
 
44
62
  if not template:
45
- return "Template not found: " + template_id
63
+ return "Template not found: " + template_id, 1
46
64
 
47
65
  spare_policy = template.get("sparePolicy", {})
48
- patch = {
49
- "sparePolicy": {
50
- "min": spare_policy.get("min", 0) + number,
51
- "max": spare_policy.get("max", 0) + number,
52
- "limit": spare_policy.get("limit", 0) + number,
53
- }
66
+ new_spare_policy = {
67
+ "min": spare_policy.get("min", 0),
68
+ "max": spare_policy.get("max", 0),
69
+ "limit": spare_policy.get("limit", 0),
54
70
  }
55
- if patch["sparePolicy"]["min"] < 0:
56
- patch["sparePolicy"]["min"] = 0
57
- if patch["sparePolicy"]["max"] < 0:
58
- patch["sparePolicy"]["max"] = 0
59
- if patch["sparePolicy"]["limit"] < 0:
60
- patch["sparePolicy"]["limit"] = 0
61
-
62
- ret = admin.template.update(template_id, org_id, patch)
71
+
72
+ if to != 0:
73
+ new_spare_policy["min"] = to
74
+ new_spare_policy["max"] = to
75
+ new_spare_policy["limit"] = to
76
+ else:
77
+ if number == 0:
78
+ number = 1 # default to expand by 1
79
+ new_spare_policy["min"] += number
80
+ new_spare_policy["max"] += number
81
+ new_spare_policy["limit"] += number
82
+
83
+ if new_spare_policy["limit"] < 0:
84
+ new_spare_policy["limit"] = 0
85
+ elif new_spare_policy["limit"] > 5000:
86
+ new_spare_policy["limit"] = 5000
87
+
88
+ if new_spare_policy["min"] < 0:
89
+ new_spare_policy["min"] = 0
90
+ elif new_spare_policy["min"] > new_spare_policy["limit"]:
91
+ new_spare_policy["min"] = new_spare_policy["limit"]
92
+ if new_spare_policy["max"] < 0:
93
+ new_spare_policy["max"] = 0
94
+ elif new_spare_policy["max"] > new_spare_policy["limit"]:
95
+ new_spare_policy["max"] = new_spare_policy["limit"]
96
+
97
+ if (
98
+ new_spare_policy["min"] == spare_policy.get("min", 0)
99
+ and new_spare_policy["max"] == spare_policy.get("max", 0)
100
+ and new_spare_policy["limit"] == spare_policy.get("limit", 0)
101
+ ):
102
+ # no change
103
+ ret = template
104
+ else:
105
+ patch = {"sparePolicy": new_spare_policy}
106
+ ret = service.template.patch(template_id, org_id, patch)
107
+
63
108
  if wait != "0":
64
- ret = admin.template.wait_for_ready(template_id, org_id, duration.to_seconds(wait))
109
+ ret = service.template.wait_for_ready(template_id, org_id, duration.to_seconds(wait))
65
110
  return ret
@@ -43,7 +43,7 @@ def update(template_id: str, update, org: str, wait: str, **kwargs):
43
43
  template = admin.template.get(template_id, org_id)
44
44
 
45
45
  if not template:
46
- return "Template not found: " + template_id
46
+ return "Template not found: " + template_id, 1
47
47
 
48
48
  allowed_fields = ["name", "description", "powerPolicy", "sparePolicy", "applicationProperties", "flags"]
49
49
 
@@ -52,7 +52,7 @@ def update(template_id: str, update, org: str, wait: str, **kwargs):
52
52
  if not patch:
53
53
  return template
54
54
 
55
- ret = admin.template.update(template_id, org_id, patch)
55
+ ret = admin.template.patch(template_id, org_id, patch)
56
56
  if wait != "0":
57
57
  ret = admin.template.wait_for_ready(template_id, org_id, duration.to_seconds(wait))
58
58
  return ret
hcs_cli/cmds/vm/delete.py CHANGED
@@ -23,10 +23,11 @@ from hcs_cli.support.param_util import parse_vm_path
23
23
 
24
24
  @click.command()
25
25
  @click.argument("vm_path", type=str, required=False)
26
+ @cli.force
26
27
  @cli.org_id
27
28
  @cli.confirm
28
29
  @cli.wait
29
- def delete(vm_path: str, org: str, confirm: bool, wait: str, **kwargs):
30
+ def delete(vm_path: str, org: str, confirm: bool, force: bool, wait: str, **kwargs):
30
31
  """Delete a VM by ID"""
31
32
  org_id = cli.get_org_id(org)
32
33
  template_id, vm_id = parse_vm_path(vm_path)
@@ -41,7 +42,7 @@ def delete(vm_path: str, org: str, confirm: bool, wait: str, **kwargs):
41
42
  if not confirm:
42
43
  click.confirm(f"Delete vm {existing['id']} from template {template['name']} ({template['id']})?", abort=True)
43
44
 
44
- vm.delete()
45
+ vm.delete(force=force)
45
46
 
46
47
  if wait == "0":
47
48
  return
hcs_cli/cmds/vm/list.py CHANGED
@@ -47,47 +47,25 @@ from hcs_cli.support.vm_table import format_vm_table
47
47
  @click.option(
48
48
  "--agent",
49
49
  "-a",
50
- type=click.Choice(
51
- ["UNAVAILABLE", "ERROR", "AVAILABLE", "INIT", "UNKNOWN", "DOMAIN_ERR", "CUSTOMIZATION_FAILURE"],
52
- case_sensitive=False,
53
- ),
54
50
  required=False,
55
- multiple=True,
56
- help="Filter VMs by agent status.",
51
+ help="Filter VMs by agent status, in comma separated values: UNAVAILABLE,ERROR,AVAILABLE,INIT,UNKNOWN,DOMAIN_ERR,CUSTOMIZATION_FAILURE",
57
52
  )
58
53
  @click.option(
59
54
  "--power",
60
55
  "-p",
61
- type=click.Choice(["PoweredOn", "PoweredOff", "PoweringOn", "PoweringOff", "Unknown"], case_sensitive=False),
62
56
  required=False,
63
- multiple=True,
64
- help="Filter VMs by power state.",
57
+ help="Filter VMs by power state, in comman separated values: PoweredOn,PoweredOff,PoweringOn,PoweringOff,Unknown",
65
58
  )
66
59
  @click.option(
67
60
  "--lifecycle",
68
- type=click.Choice(
69
- [
70
- "PROVISIONING",
71
- "PROVISIONED",
72
- "MAINTENANCE",
73
- "DELETING",
74
- "ERROR",
75
- "CUSTOMIZING",
76
- "AGENT_UPDATING",
77
- "AGENT_REINSTALLING",
78
- ],
79
- case_sensitive=False,
80
- ),
61
+ type=str,
81
62
  required=False,
82
- multiple=True,
83
- help="Filter VMs by lifecycle status.",
63
+ help="Filter VMs by lifecycle status, in comma separated values: PROVISIONING,PROVISIONED,MAINTENANCE,DELETING,ERROR,CUSTOMIZING,AGENT_UPDATING,AGENT_REINSTALLING",
84
64
  )
85
65
  @click.option(
86
66
  "--session",
87
- type=click.Choice(["AVAILABLE", "UNAVAILABLE", "DRAINING", "QUIESCING", "REPRISTINING"], case_sensitive=False),
88
67
  required=False,
89
- multiple=False,
90
- help="Filter VMs by power state.",
68
+ help="Filter VMs by session placement status, in comma separated values: AVAILABLE,UNAVAILABLE,DRAINING,QUIESCING,REPRISTINING",
91
69
  )
92
70
  @cli.formatter(format_vm_table)
93
71
  def list_vms(
@@ -97,33 +75,34 @@ def list_vms(
97
75
  type: list,
98
76
  agent: list,
99
77
  power: list,
100
- lifecycle: list,
78
+ lifecycle: str,
101
79
  session: str,
102
80
  **kwargs,
103
81
  ):
104
82
  """List template VMs"""
105
83
  org_id = cli.get_org_id(org)
106
84
 
107
- agent = _to_lower(agent)
108
- power = _to_lower(power)
109
- lifecycle = _to_lower(lifecycle)
85
+ filttered_agent_states = _parse_multi_state(agent, "agent")
86
+ filtered_power_states = _parse_multi_state(power, "power")
87
+ filtered_lifecycle_states = _parse_multi_state(lifecycle, "lifecycle")
88
+ filtered_session_states = _parse_multi_state(session, "session")
110
89
 
111
90
  def filter_vm(vm):
112
- if agent:
91
+ if filttered_agent_states:
113
92
  s = vm.get("agentStatus")
114
- if not s or s.lower() not in agent:
93
+ if not s or s.upper() not in filttered_agent_states:
115
94
  return False
116
- if power:
95
+ if filtered_power_states:
117
96
  s = vm.get("powerState")
118
- if not s or s.lower() not in power:
97
+ if not s or s.upper() not in filtered_power_states:
119
98
  return False
120
- if lifecycle:
99
+ if filtered_lifecycle_states:
121
100
  s = vm.get("lifecycleStatus")
122
- if not s or s.lower() not in lifecycle:
101
+ if not s or s.upper() not in filtered_lifecycle_states:
123
102
  return False
124
- if session:
103
+ if filtered_session_states:
125
104
  s = vm.get("sessionPlacementStatus")
126
- if not s or s.lower() != session.lower():
105
+ if not s or s.upper() not in filtered_session_states:
127
106
  return False
128
107
  return True
129
108
 
@@ -178,6 +157,39 @@ def list_vms(
178
157
  return vms
179
158
 
180
159
 
160
+ def _parse_multi_state(param_list: str, name: str):
161
+ if not param_list:
162
+ return None
163
+ param_list = param_list.upper()
164
+ values = []
165
+
166
+ valid_map = {
167
+ "lifecycle": [
168
+ "PROVISIONING",
169
+ "PROVISIONED",
170
+ "MAINTENANCE",
171
+ "DELETING",
172
+ "ERROR",
173
+ "CUSTOMIZING",
174
+ "AGENT_UPDATING",
175
+ "AGENT_REINSTALLING",
176
+ ],
177
+ "agent": ["UNAVAILABLE", "ERROR", "AVAILABLE", "INIT", "UNKNOWN", "DOMAIN_ERR", "CUSTOMIZATION_FAILURE"],
178
+ "power": ["POWEREDON", "POWEREDOFF", "POWERINGON", "POWERINGOFF", "UNKNOWN"],
179
+ "session": ["AVAILABLE", "UNAVAILABLE", "DRAINING", "QUIESCING", "REPRISTINING"],
180
+ }
181
+ if name not in valid_map:
182
+ raise Exception(f"Unknown multi-state filter name: {name}")
183
+
184
+ valid = valid_map[name]
185
+ for s in param_list.split(","):
186
+ s = s.strip()
187
+ if s not in valid:
188
+ raise Exception(f"Invalid {name} value: {s}. Valid values are: {', '.join(valid)}")
189
+ values.append(s)
190
+ return values
191
+
192
+
181
193
  def _to_lower(values):
182
194
  if values:
183
195
  return [v.lower() for v in values]
@@ -556,7 +556,7 @@ def power_policy_on_template(template: dict, enable: bool, verbose: bool):
556
556
  patch = calculate_patch(template, allowed_fields, [field])
557
557
  for i in range(3):
558
558
  try:
559
- admin.template.update(template_id, target_org_id, patch)
559
+ admin.template.patch(template_id, target_org_id, patch)
560
560
  admin.template.wait_for_ready(template_id, target_org_id, 60)
561
561
  break
562
562
  except Exception as ex:
@@ -43,9 +43,9 @@
43
43
  },
44
44
  "image": {
45
45
  "imageReference": {
46
- "publisher": "Canonical",
47
- "offer": "UbuntuServer",
48
- "sku": "18.04-LTS",
46
+ "publisher": "canonical",
47
+ "offer": "0001-com-ubuntu-server-jammy",
48
+ "sku": "22_04-lts-gen2",
49
49
  "version": "latest"
50
50
  },
51
51
  "os": "linux",
@@ -61,7 +61,8 @@
61
61
  },
62
62
  "properties": {
63
63
  "azureCreateResourceGroup": true,
64
- "new-task-engine": false,
65
- "simulateAgentStatus": "AVAILABLE"
64
+ "new-task-engine": true,
65
+ "simulateAgentStatus": "AVAILABLE",
66
+ "countinuousErrorThreshold": 3
66
67
  }
67
68
  }
@@ -56,8 +56,9 @@
56
56
  }
57
57
  },
58
58
  "properties": {
59
- "new-task-engine": false,
59
+ "new-task-engine": true,
60
60
  "sg-lcm-enforced-provision": true,
61
- "autonomous": true
61
+ "autonomous": true,
62
+ "countinuousErrorThreshold": 2
62
63
  }
63
64
  }
@@ -16,4 +16,13 @@ limitations under the License.
16
16
  # Deprecated.
17
17
  # To be removed in the future.
18
18
 
19
- from ..template import action, create, delete, get, items, list, update, wait_for, wait_for_deleted, wait_for_ready
19
+ from ..template import action as action
20
+ from ..template import create as create
21
+ from ..template import delete as delete
22
+ from ..template import get as get
23
+ from ..template import items as items
24
+ from ..template import list as list
25
+ from ..template import patch as patch
26
+ from ..template import wait_for as wait_for
27
+ from ..template import wait_for_deleted as wait_for_deleted
28
+ from ..template import wait_for_ready as wait_for_ready
@@ -42,3 +42,14 @@ def search(payload: dict, size: int = 100):
42
42
  pointer_timestamp = max(data["d"]["utcTime"] + 1, pointer_timestamp + 1000)
43
43
 
44
44
  # log.info(f"events={count - _old}")
45
+
46
+
47
+ def aggregateConnects(payload: dict, verbose: bool = False):
48
+ url = "/v1/stats/connect/aggregateConnects"
49
+ if verbose:
50
+ print(f"POST: {url}")
51
+ print(payload)
52
+ response = _client.post(url, json=payload)
53
+ if isinstance(response, str):
54
+ response = json.loads(response)
55
+ return response
@@ -1,2 +1,15 @@
1
- from .session import assign, assignV2, create_manual_session, deassign, logoff, logoffV2, sessions, update_session
2
- from .vm import count, get, list, raw_list, update
1
+ from .session import assign as assign
2
+ from .session import assignV2 as assignV2
3
+ from .session import create_manual_session as create_manual_session
4
+ from .session import deassign as deassign
5
+ from .session import logoff as logoff
6
+ from .session import logoffV2 as logoffV2
7
+ from .session import sessions as sessions
8
+ from .session import update_session as update_session
9
+ from .vm import count as count
10
+ from .vm import get as get
11
+ from .vm import list as list
12
+ from .vm import raw_list as raw_list
13
+ from .vm import update as update
14
+ from .vm import begin_deleting_vms_by_id as begin_deleting_vms_by_id
15
+ from .vm import finish_deleting_vms as finish_deleting_vms
@@ -65,6 +65,18 @@ def finish_adding_vms(template_id: str, org_id: str, num_sessions: int, template
65
65
  return _client.post(url, vms)
66
66
 
67
67
 
68
+ def begin_deleting_vms_by_id(template_id: str, org_id: str, vm_ids: list, **kwargs):
69
+ url = f"/v1/{template_id}/beginDeletingVMsById?org_id={org_id}"
70
+ url = with_query(url, **kwargs)
71
+ return _client.post(url, json=vm_ids)
72
+
73
+
74
+ def finish_deleting_vms(template_id: str, org_id: str, vm_ids: list, **kwargs):
75
+ url = f"/v1/{template_id}/finishDeletingVMs?org_id={org_id}"
76
+ url = with_query(url, **kwargs)
77
+ return _client.post(url, json=vm_ids)
78
+
79
+
68
80
  def count(template_id: str, org_id: str = None, **kwargs):
69
81
  url = f"/v1/{template_id}/count"
70
82
  kwargs["countVM"] = True
@@ -53,13 +53,16 @@ def create(template: dict):
53
53
  return _client.post(url=url, json=template)
54
54
 
55
55
 
56
+ def patch(id: str, org_id: str, patch_to: dict, **kwargs):
57
+ url = f"/v1/templates/{id}?org_id={org_id}"
58
+ # print(url)
59
+ # import json
60
+ # print(json.dumps(patch_to))
61
+ return _client.patch(url, json=patch_to)
62
+
63
+
56
64
  def update(template: dict):
57
- url = "/v1/templates"
58
- # workaround for AKKA
59
- if template["providerType"] == "AKKA":
60
- pass
61
- else:
62
- url += "/" + template["providerType"].lower()
65
+ url = "/v1/templates/" + template["providerType"].lower()
63
66
  return _client.post(url=url, json=template)
64
67
 
65
68
 
@@ -32,7 +32,7 @@ def delete(id: str, org_id: str, force: bool = True):
32
32
  return _crud.delete(id, org_id, force=force)
33
33
 
34
34
 
35
- def update(id: str, org_id: str, patch_to: dict, **kwargs):
35
+ def patch(id: str, org_id: str, patch_to: dict):
36
36
  url = f"/v2/templates/{id}?org_id={org_id}"
37
37
  # print(url)
38
38
  # import json
@@ -46,8 +46,8 @@ def format_vm_table(data):
46
46
  "agentStatus",
47
47
  {
48
48
  "AVAILABLE": "green",
49
- "ERROR": lambda d: "bright_black" if d["powerState"] != "PoweredOn" else "red",
50
- "UNAVAILABLE": lambda d: "bright_black" if d["powerState"] != "PoweredOn" else "red",
49
+ "ERROR": lambda d: "bright_black" if d.get("powerState") != "PoweredOn" else "red",
50
+ "UNAVAILABLE": lambda d: "bright_black" if d.get("powerState") != "PoweredOn" else "red",
51
51
  },
52
52
  )
53
53
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hcs-cli
3
- Version: 0.1.319
3
+ Version: 0.1.321
4
4
  Summary: Horizon Cloud Service CLI.
5
5
  Project-URL: Homepage, https://github.com/euc-eng/hcs-cli
6
6
  Project-URL: Bug Tracker, https://github.com/euc-eng/hcs-cli/issues
@@ -14,7 +14,7 @@ Classifier: License :: OSI Approved :: MIT License
14
14
  Classifier: Operating System :: OS Independent
15
15
  Classifier: Programming Language :: Python :: 3
16
16
  Requires-Python: >=3.9
17
- Requires-Dist: hcs-core>=0.1.319
17
+ Requires-Dist: hcs-core>=0.1.321
18
18
  Requires-Dist: inquirerpy>=0.3.4
19
19
  Requires-Dist: matplotlib>=3.8.0
20
20
  Requires-Dist: paho-mqtt>=2.1.0
@@ -1,4 +1,4 @@
1
- hcs_cli/__init__.py,sha256=GmE3XLJrOylzf4SErEpUcXMCHNNcNCp_3INULHkhrOE,47
1
+ hcs_cli/__init__.py,sha256=dX6e1kri6Gcqjvlr5u1l5USUlOgjbOKPHS5vP_FG78Y,72
2
2
  hcs_cli/__main__.py,sha256=lwPXLjh1OpOs4doVLJJ6_3XHtC-VqDOXiw45hvAQorM,684
3
3
  hcs_cli/main.py,sha256=0NmRcidxNxtJatS_prEKQ4_6bqu-l8UkLhAPOXW3uyc,3537
4
4
  hcs_cli/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -7,7 +7,7 @@ hcs_cli/cmds/inspect.py,sha256=QBhBOkf2mHlGhgAhY9FXCfvViL2p4D3BudoKjyADdfE,659
7
7
  hcs_cli/cmds/login.py,sha256=dj42jDrKktt4bUqSD0Xj6Jo9ZSI7M9v9R280YavWpuc,11165
8
8
  hcs_cli/cmds/logout.py,sha256=BxU-K1cIkdBpAAp6SGuwEqECL6g20l9CqEcSX-3pZag,744
9
9
  hcs_cli/cmds/query.py,sha256=hh1TVeSkvRiB07fqIA3GGpEBtP3XMz5XCmAGTXD7FOM,9302
10
- hcs_cli/cmds/task.py,sha256=7w54riLLH-RFiqd-jeDNUsB9pSY3BtrWYD9AJMlD5-g,19472
10
+ hcs_cli/cmds/task.py,sha256=YIZUjDzHZaNCbmAt589Nzp8s7NMsBI7w_a33l109iy8,19564
11
11
  hcs_cli/cmds/test.py,sha256=Kkpe3wV3ViRRAKeMO5IBwjTysEsKzZXP46OXNb-GhxE,1309
12
12
  hcs_cli/cmds/upgrade.py,sha256=iJYSyxyNBhiss0u605nD6jpYUdoDhjfIeJP98zSeDf4,931
13
13
  hcs_cli/cmds/ad/__init__.py,sha256=wC4uftNZRN3bo9SrRHNNE1tzE0x3B1mCXcIzARm73gI,636
@@ -73,7 +73,7 @@ hcs_cli/cmds/dev/onboard.py,sha256=7guWRWbJIDOBiDMdWghAilyERmxQY3HCdt6atnauYXA,1
73
73
  hcs_cli/cmds/dev/test.py,sha256=VP-I-H3MdS1j8FaTiZclQt4HCLUPmiXg__4cn1smgM8,976
74
74
  hcs_cli/cmds/dev/fs/__init__.py,sha256=8hlQwsU-qFh1L2TmyQ9gokur7vxjCl1fwChEbkK8cgg,633
75
75
  hcs_cli/cmds/dev/fs/auth.py,sha256=GsjT-ATwD_G_BUma0PK114KME3RnF_lDKHB0HrjGQKs,909
76
- hcs_cli/cmds/dev/fs/clear.py,sha256=yD7LrwWky9WczS2JNkCod-CpxetrNOMxr-R-YHfx1do,3645
76
+ hcs_cli/cmds/dev/fs/clear.py,sha256=G3Dk2HjBd5dS7jCz5CYeuqya2I5VoChjY8oguuHemis,3965
77
77
  hcs_cli/cmds/dev/fs/init.py,sha256=0ogDcipzMiGPa2IKz5V43Rec3vqjh-wHxv30NoysGpE,39199
78
78
  hcs_cli/cmds/dev/fs/profiler.py,sha256=3IPhiCsYebVKaqvmXUocNJXQAX4yQBjxQWPxrRriaRE,3564
79
79
  hcs_cli/cmds/dev/fs/tailor.py,sha256=ehTR5GsXKdB_8X3YDQWN-0Xq_rdC0ZilB2LHJ0BLuyc,6969
@@ -89,7 +89,7 @@ hcs_cli/cmds/dev/fs/provided_files/__init__.py,sha256=AC-hl0F-5R4V2uejk5FzFDlvT7
89
89
  hcs_cli/cmds/dev/fs/provided_files/akka.plan.yml,sha256=IBBuxU-oxiFfEMhpOB7uK9IMoHsRVwlcnKwPPfbPnyw,12486
90
90
  hcs_cli/cmds/dev/fs/provided_files/azsim.plan.yml,sha256=rnjNWSnhaYr19tlKoxGjvKTlhs2pYA2NRC-dC3kIzYE,17220
91
91
  hcs_cli/cmds/dev/fs/provided_files/azure.plan.yml,sha256=4-ghUgskCyeM-G0kvWb_AW1ywlN9wKN_kC3XSWfryY8,31561
92
- hcs_cli/cmds/dev/fs/provided_files/mqtt-secret.yaml,sha256=46O-pJOKhJ5LyPFw6wiqWEFmRrv_9JwTKQPxmbq2Ro4,14945
92
+ hcs_cli/cmds/dev/fs/provided_files/mqtt-secret.yaml,sha256=lJI6N4e3ogiZ9BpyjWUHqj3KfbGs7WUdYuaPt1D8TLw,14939
93
93
  hcs_cli/cmds/dev/fs/provided_files/mqtt-server-external.yaml,sha256=gtYLY9pgMCeJthYmTXrLjd3xITf4b2keesyQ8VBAar8,612
94
94
  hcs_cli/cmds/dev/fs/provided_files/patch-mqtt-hostname.yml,sha256=YuwUPj5QtZo1dKOqNsh72EVXdVBxr2ZQBcW4gyX0agY,212
95
95
  hcs_cli/cmds/dev/fs/provided_files/patch-vernemq-ssl-depth.json,sha256=jDuQLeen8aJ656gfJhk16aGyUCbOLt7VJq9AuUezNE4,441
@@ -116,6 +116,7 @@ hcs_cli/cmds/hoc/connect.py,sha256=GvXfbB1JhAZRnl1_H1oxCAhAMCP9jtJgAlhVy9ggYNc,5
116
116
  hcs_cli/cmds/hoc/oncall.py,sha256=yc7s94Ti21QDm6WZAbuzB21GsGwced5jLrfmvkV8J2c,575
117
117
  hcs_cli/cmds/hoc/org.py,sha256=fi2rjO4hLuJuLSinWG3s8-dTdAj9EIrIFcN82LM8mtI,570
118
118
  hcs_cli/cmds/hoc/search.py,sha256=yQk1BTp6sSPer8YdCqNd458CpwuJ5PM50_3yjwv8T7g,5447
119
+ hcs_cli/cmds/hoc/stats.py,sha256=QEnAULDIhvsEgMLJg4Ql9cI6wUqd0zQW2QjwBWwXdno,2641
119
120
  hcs_cli/cmds/hoc/template.py,sha256=M9bPYDuPfYQjjR8SYS4r4NknckSAfrMJGW6GeczCZvw,574
120
121
  hcs_cli/cmds/hoc/vm.py,sha256=YjijTxpSbnUKyCtsc9wIYDYZULM4RKo2JfROdilmNvk,664
121
122
  hcs_cli/cmds/hoc/util/__init__.py,sha256=AC-hl0F-5R4V2uejk5FzFDlvT7uKGfjQyWq0quSznQs,14
@@ -150,6 +151,7 @@ hcs_cli/cmds/inventory/__init__.py,sha256=MHbL9kVMQm--omd6_50d48o9Ff8vlQ9JWXEtW0
150
151
  hcs_cli/cmds/inventory/assign.py,sha256=ijZna58rMq1JLUytb6EyuSqd5CLZrqehfEpTqxKEfYs,4923
151
152
  hcs_cli/cmds/inventory/count.py,sha256=AR_9HyO4hMLJp1FhrX4RTbpqF2aLWjiyKASdBi5kfjE,401
152
153
  hcs_cli/cmds/inventory/deassign.py,sha256=Nwo3dct1FtVUel6TVG8sQzGL6qYR3yqx3q-WfMgZ_GI,2272
154
+ hcs_cli/cmds/inventory/delete.py,sha256=wwZGmO0nQnXINR0DjuRkpaBkJC9d5MrusLfiUBbh3-k,1679
153
155
  hcs_cli/cmds/inventory/get.py,sha256=EpGoHzNA9taubw5ohkoj6bsQQVz2nBn8z05i5vKzH58,1072
154
156
  hcs_cli/cmds/inventory/list.py,sha256=Cmm7uhNSsBJVgXqEFuPlTrKMe6yCZU1GLWU4BnFtgZo,3602
155
157
  hcs_cli/cmds/inventory/logoff.py,sha256=EUE_RcEnnFhgtBePXcP-CerRHgFfzTqItrCddUVyJTc,4137
@@ -162,7 +164,7 @@ hcs_cli/cmds/lcm/health.py,sha256=aAnNKPQSdV1rezwMdXqVF9sG_n8ajoa8eggwTOJje-4,78
162
164
  hcs_cli/cmds/lcm/register.py,sha256=BO7UtE-3xIuwDMd0Go2SXln-YdQAYZJJfRAGAJDSWM8,1664
163
165
  hcs_cli/cmds/lcm/test.py,sha256=QV5FN6Xy1ka0GplPtXit3czn5HhEiv0HPt6SFwLL7tM,936
164
166
  hcs_cli/cmds/lcm/provider/__init__.py,sha256=PZyypOINS42FE9UF6HUzL4p-5OhlfmemR96f7HykaHE,628
165
- hcs_cli/cmds/lcm/provider/create.py,sha256=rbKc59k7H1HXoQYnLipMRwlaQOewzUEy6kZcDr-qVoQ,3377
167
+ hcs_cli/cmds/lcm/provider/create.py,sha256=_KhSkng3R0V1H594CFA-qpR6GPIYSlGXKUAZsRqATl4,3677
166
168
  hcs_cli/cmds/lcm/provider/delete.py,sha256=jBHBHX7AV1X2jM4WXzCrL84jlyhgWdVtjOLmbbGahvc,1002
167
169
  hcs_cli/cmds/lcm/provider/get.py,sha256=6CFNWM8RWXS2eR6G6Xas4Md9qSchbEhb9WLD85YxVbE,921
168
170
  hcs_cli/cmds/lcm/provider/list.py,sha256=b4HWh_ZMj7HqqR2lOQLUoKlpt13TdwGpQFYbp0Inb8U,1076
@@ -170,6 +172,7 @@ hcs_cli/cmds/lcm/template/__init__.py,sha256=0MLiuwktWNE_kV36BGSXEv8jAUZQCLHWpfm
170
172
  hcs_cli/cmds/lcm/template/cancel.py,sha256=EKjL_EoSem6NNxwB-uDTfvTY-Z3Fh4E-OEUpsm7zCIM,1061
171
173
  hcs_cli/cmds/lcm/template/create.py,sha256=fvg9yCkST4JpYCbtX5hOas0rPEQL1XkpsKOEM4lrj34,2692
172
174
  hcs_cli/cmds/lcm/template/delete.py,sha256=_lf7gEJFvrdc1_U18_-URvPiXURbw88YxU9eEZ_RLFE,1336
175
+ hcs_cli/cmds/lcm/template/expand.py,sha256=zF5aR6igfQEH8m0QVF_HkIO__HrxYSMk7g4S7eqLiCg,1314
173
176
  hcs_cli/cmds/lcm/template/get.py,sha256=siSdvS_KEVIIcRSHFgMs3R2MFbdl1f9-yeVmQiZtlZ8,1048
174
177
  hcs_cli/cmds/lcm/template/health.py,sha256=PPXO5-8Vytj7WUgsRVQ05VipC2hdlQXlbxRec1HeOWQ,1428
175
178
  hcs_cli/cmds/lcm/template/list.py,sha256=tjupel3IZKkBrvy75czB32wUU5hV70SHZwy9L7AFHPc,3203
@@ -179,7 +182,7 @@ hcs_cli/cmds/lcm/template/update.py,sha256=B4HTlXt-EfOtsIKOChoY5ZX6PWY72wNunk25S
179
182
  hcs_cli/cmds/lcm/template/use.py,sha256=E9fQgdAYri9FJwRtIJvSw3hQBSjSaMSLtFrY1fF0sF4,1459
180
183
  hcs_cli/cmds/lcm/template/wait.py,sha256=nAfeu6v-hPSK96Ov2-zzczOXgBTfKHA-ho4XycnsBV4,2638
181
184
  hcs_cli/cmds/lcm/vm/__init__.py,sha256=SflvFQtT5sCprl6RtseVMrFuOyYHOkZf83AsvdUEFqs,622
182
- hcs_cli/cmds/lcm/vm/delete.py,sha256=GjdaSbKAFtKmMe3tkbthSDKXmWDkFKCPqLT8AC2G20w,1349
185
+ hcs_cli/cmds/lcm/vm/delete.py,sha256=qx3swt_Ro5ALojQbFC30cdait455EbBU9zOC6s-92vM,1386
183
186
  hcs_cli/cmds/lcm/vm/get.py,sha256=CVByeki8devUWLs9X41PIQhnOQBkCQ5OckYZxioRrds,1081
184
187
  hcs_cli/cmds/lcm/vm/pair.py,sha256=4TMs9VjWa_X6ph-tqI3rF6lDo5NL3BhhJQpLFcWgegE,1060
185
188
  hcs_cli/cmds/lcm/vm/pairing_info.py,sha256=HPAXZM2MZrdmmJt74yJR7S7PmM0F3hkBAfHCjoxI58k,1200
@@ -261,12 +264,12 @@ hcs_cli/cmds/synt/report/list.py,sha256=vk0A-rNPWakKLfuzp3TzTLn47dcMDjAKuujRdaq5
261
264
  hcs_cli/cmds/template/__init__.py,sha256=0MLiuwktWNE_kV36BGSXEv8jAUZQCLHWpfmRvu-IHCU,628
262
265
  hcs_cli/cmds/template/create.py,sha256=LBK0ijSeAS2PECR81FGRAlh9Zu6kxQQw6173Kxqkd8E,1909
263
266
  hcs_cli/cmds/template/delete.py,sha256=GSxtTKqe0DSE6FNt20FMGwFlTKNvygMDTTnxHPwBiRM,1330
264
- hcs_cli/cmds/template/expand.py,sha256=_Pv9ewmk1iX9h-YzQFn1wIvqWl2SAhVfcOzLF9LCN_U,2082
267
+ hcs_cli/cmds/template/expand.py,sha256=ewdKhhkheB73RD6Z4-bClNxK9NPRBGjXtP92jwxNV7E,3556
265
268
  hcs_cli/cmds/template/fix.py,sha256=aMRamRlJHS1ARseU3MKVRft0ilnbN-vtjO8Ia2S8TA4,2813
266
269
  hcs_cli/cmds/template/get.py,sha256=M-GSJfsV9RWyFomQdwtkB7_Ga52G8TXlcNseo4crolQ,1017
267
270
  hcs_cli/cmds/template/list.py,sha256=106v3Ng-n7AlvSvVa7GYxQQmY7R1qBfP45XnjDTa8Ko,3526
268
271
  hcs_cli/cmds/template/list_usage.py,sha256=eVszi1XPLCshLTx9SlaJYsF5d_6MrAflkAqdIS5gP2M,4337
269
- hcs_cli/cmds/template/update.py,sha256=Ry39U_Brx8UST9yOTLFI4vC98w-o6owPbpRyF4bebc0,1830
272
+ hcs_cli/cmds/template/update.py,sha256=R28_4ElCaAPLuCh6GDWBYtHs6-3ARBb-FLxb1jXyNl0,1832
270
273
  hcs_cli/cmds/template/usage.py,sha256=AfhgBpJqVhqi3u3_jjvjQjbUW4Kav6VSRatEEEhf3Q8,9373
271
274
  hcs_cli/cmds/template/use.py,sha256=GhWA8N9nUiVJeU-Qco8Rl_g8xO_0uGDNTmJAUMK6H-4,1462
272
275
  hcs_cli/cmds/template/wait.py,sha256=YE1-Sbi-4olFk7GNCUmwE1UDFtjey880TeTaGdsGeIs,2459
@@ -276,9 +279,9 @@ hcs_cli/cmds/uag/get.py,sha256=mLBOvpVjnJj6BWtl_0u9j4aUJcF_KQMKvuxwd18gSl8,992
276
279
  hcs_cli/cmds/uag/list.py,sha256=h-iEEzpSufqGrBNVUKciMW5kot82URqe3724z3Vz87w,947
277
280
  hcs_cli/cmds/vm/__init__.py,sha256=SflvFQtT5sCprl6RtseVMrFuOyYHOkZf83AsvdUEFqs,622
278
281
  hcs_cli/cmds/vm/actions.py,sha256=anZZ0iWNyN_STOIgJ-q3iYUkTfjEJe5_yrMWYAgRAzg,3921
279
- hcs_cli/cmds/vm/delete.py,sha256=qShFy2AYoPd5M_W5fK4RTWnL5gJ91qLUum169O7StiI,1453
282
+ hcs_cli/cmds/vm/delete.py,sha256=_BRnmWnQqSN4fg2zOMVGJOEz162UMj0S-kRsk6EQf8c,1488
280
283
  hcs_cli/cmds/vm/get.py,sha256=CblKzcYwufBXYwX6h1jcui6DF_cE0xjbHiJXv-PDcyo,1037
281
- hcs_cli/cmds/vm/list.py,sha256=6Uw-Zs4GKiuyQohgGtbaXSZJ76qOyn9WK5RuZHVSSZU,5587
284
+ hcs_cli/cmds/vm/list.py,sha256=_WMAn4bQVpdnQUP76FlqRx6Y8Y5rYDRpQ1U_WNUTGF8,6598
282
285
  hcs_cli/cmds/vm/pairing_info.py,sha256=6ahK0tINjhyZVeFgSe5jbUITF8F9mUsdvMftIOTT9bI,1177
283
286
  hcs_cli/cmds/vm/put.py,sha256=mHrv4niFLLW9ENQFznaTd_Jmwms0DAoIKKlOF-GjBSQ,1199
284
287
  hcs_cli/cmds/vm/use.py,sha256=P3jnw5l42rrx7RB0iAWvINbq9XUwsHNn8n5wL_I3CvU,1830
@@ -292,7 +295,7 @@ hcs_cli/cmds/vmm/__init__.py,sha256=jTmyoqXOsPaSLNirVYvb4l_Pc2Qn9OgpMVFI21YuBNo,
292
295
  hcs_cli/cmds/vmm/restart_vms.py,sha256=n9FzXBMMigVO55Bl1e6kJBILa9o_PfJ8JGDmJvxEgfk,3278
293
296
  hcs_cli/cmds/vmm/rootca_edge_migration_stats.py,sha256=Oe9YBsHCtp_V7tmMVN1M9KdGHDxafE63n-PC-uKq8Uc,27166
294
297
  hcs_cli/cmds/vmm/rootca_edge_rotate_certs.py,sha256=KUq4CwgemWyPtJa4ys_d-khZdFmBqKcKvMDA3_VBRkc,12680
295
- hcs_cli/cmds/vmm/rootca_migrate.py,sha256=Y5oUjIpfeGYVMsRM_KYv17bZbH5c6BXu-CqPM4KAliI,37982
298
+ hcs_cli/cmds/vmm/rootca_migrate.py,sha256=3bJ_FrbqDh3dwzHq1gB0prjmThQ04d3bR8BZQzLaFqU,37981
296
299
  hcs_cli/cmds/vmm/rootca_migrate_edge.py,sha256=6r1HvPYaBLfNogCmRbKVCdFlF9hy_DpAtE1Iag2y4ok,18625
297
300
  hcs_cli/cmds/vmm/rootca_template_migration_stats.py,sha256=npVzjNpsJpTEG-ax5seSIluz-70Fb0pSiDKNcubB53Y,9376
298
301
  hcs_cli/cmds/workflows/__init__.py,sha256=GIkOdlgxB8z97dAhJvlHHaaM9Ey5cH6b-eNAsz6M7oM,650
@@ -314,8 +317,7 @@ hcs_cli/payload/inventory/deassign.json,sha256=evl-Nt-6Sc4Mm-F9YS734H1x0aIrf7N3W
314
317
  hcs_cli/payload/iss/__init__.py,sha256=4kFVMPKtDxlxFWs6qXrhBJjgEJesuGTCjBBm2a4JsBM,600
315
318
  hcs_cli/payload/lcm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
316
319
  hcs_cli/payload/lcm/akka.json,sha256=_PUNdUO2CFj5AimOWkgc1zvVxy1hrWNq99YHYP3hxhA,673
317
- hcs_cli/payload/lcm/azure-dummy-nt.json,sha256=CepHhef-lyyE08XZGqq5aohh4VJQ41GknBqyi7qH1_A,1562
318
- hcs_cli/payload/lcm/azure-dummy.json,sha256=CgIK9bGH4nmUfZoHxbAypIYpFQyrzGMUQ50cRUODFVQ,1563
320
+ hcs_cli/payload/lcm/azure-dummy.json,sha256=fu4hSSGBSoKZD6kHPm62TQ3xSTFhCCD7-NRkDMRHTSI,1619
319
321
  hcs_cli/payload/lcm/azure-real.json,sha256=QF9TdNKdLQRWjDC610LbU1-DWzxbncTBu0MEUPIiVxI,1561
320
322
  hcs_cli/payload/lcm/edge-proxy.json,sha256=PAlwNpkN9HJ-PZ5PEMM8sc_O_eSABcyktAiOoohlTQk,744
321
323
  hcs_cli/payload/lcm/zero-dedicated.json,sha256=U8n2KPjPNLMe0ywyfbpu5gRwYI03CexidJrX_gTMCog,782
@@ -328,16 +330,16 @@ hcs_cli/payload/lcm/zero-fail-prepare.json,sha256=p3uVwSGTwXC6iXhsH66fFjiG6vJeK-
328
330
  hcs_cli/payload/lcm/zero-fail-vm-onthread.json,sha256=vty-OqyRhtItWNj1opWfQwL5HK75KTmjg0uFxnAF5yk,1307
329
331
  hcs_cli/payload/lcm/zero-fail-vm.json,sha256=VSFgt4dAlRu52uz5BZmavvkr1kBarOt2d345AtA00xw,1307
330
332
  hcs_cli/payload/lcm/zero-floating.json,sha256=8fO_5C3eNoBlI8RD8cZPP_XB6ZJeyq_U-7Nw8A8bHO0,780
333
+ hcs_cli/payload/lcm/zero-legacy.json,sha256=E3hA0bCnQx29mQQFtjdKuC2R_-IqaPDGItcL6WPugf4,886
331
334
  hcs_cli/payload/lcm/zero-manual.json,sha256=SLez__1qO1eMLZW-9GOnxEXTWrfd5TQFmNCb-J9SGEI,741
332
335
  hcs_cli/payload/lcm/zero-multisession.json,sha256=OtB7KC5VlrQvWRjtiYQijTwu-jjtoCcaGFQmVBijerM,788
333
336
  hcs_cli/payload/lcm/zero-nanw.json,sha256=ALsXhqTeUN8q4xqiDgWk3RiWZXVUVyyrrUj14_lFisE,720
334
337
  hcs_cli/payload/lcm/zero-new-5k-delay.json,sha256=UOh6E0FUks6Ozo0EjjhCAjhD7R7gyKdT2sTEhMy9DcY,1571
335
338
  hcs_cli/payload/lcm/zero-new-5k.json,sha256=fgiZbLr2cPoLCfLdn2uNFp_GxROHIiadUlbhDqEbESQ,828
336
339
  hcs_cli/payload/lcm/zero-new-snapshot.json,sha256=E3hA0bCnQx29mQQFtjdKuC2R_-IqaPDGItcL6WPugf4,886
337
- hcs_cli/payload/lcm/zero-new.json,sha256=E3hA0bCnQx29mQQFtjdKuC2R_-IqaPDGItcL6WPugf4,886
338
340
  hcs_cli/payload/lcm/zero-reuse-vm-id.json,sha256=WWbPUijukAaS1ADz8AnEhU5U0s6qKUdbBU1v29HbhS4,716
339
341
  hcs_cli/payload/lcm/zero-with-max-id-offset.json,sha256=fo6JO-QHV7ln8rKswhhLZ67v_9skeW1HwZXgaNzPsuc,698
340
- hcs_cli/payload/lcm/zero.json,sha256=RF6pjji0RGjp85UJ32PXrqC3_b8yPPFA1LCiqNAztY0,1353
342
+ hcs_cli/payload/lcm/zero.json,sha256=sS5X5FPkU0mSO-PeGPcJobFoxtC2FJFznqPuXq6ZmW4,1388
341
343
  hcs_cli/payload/provider/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
342
344
  hcs_cli/payload/provider/ad-stes-vsphere.json,sha256=GgjpDxQY4X_fQNY46-fls0248nuhEgPu6qOcA9MbI0Y,717
343
345
  hcs_cli/payload/provider/akka.json,sha256=pKRZT9aOx0irx-28iUFNNwdQ-s1sNgVPCMz7RdASKTM,284
@@ -397,7 +399,7 @@ hcs_cli/service/graphql.py,sha256=Vqt4wMeRSPV_2YhGvb9vs0vlac0_fMAhg1BijKX6reg,46
397
399
  hcs_cli/service/pool.py,sha256=EjTENTX5wSZ-YhP8ON_tonB54-OhjWCluzIHVR7ed04,1266
398
400
  hcs_cli/service/site.py,sha256=th23Ucm8HgU96Rbt2m8ww2YrISj2Oksojc4atkdjRNM,1568
399
401
  hcs_cli/service/task.py,sha256=qqAQPqIS66cBp-f_4zsLm2-iEsWwB6rkBgczDVAlo-Y,9565
400
- hcs_cli/service/template.py,sha256=mOdYVLkWtnRkCPRHi0Bdv0CbyPxypEA5eptnienEVWQ,2807
402
+ hcs_cli/service/template.py,sha256=pCHmMX8zSdq0RX7bCftVog0_hNQU5gIe2o0FevxpKeg,2796
401
403
  hcs_cli/service/uag.py,sha256=5TMt6lqxMVOlp6d49aOZsKFfcgGRdE03Ew4yVWwbw7Q,3747
402
404
  hcs_cli/service/vm.py,sha256=9yfG_B8omd6lkXEvLbOd1tpFc_j-P40Y5aZG-_-TeC4,5398
403
405
  hcs_cli/service/admin/__init__.py,sha256=ASx6VsdgNleP9frkrKadkEg1G2NS0FyC0pAUN2ivssg,88
@@ -406,7 +408,7 @@ hcs_cli/service/admin/azure_infra.py,sha256=8fSP-CozFZKLL_sVHux-ivrM04xab3zYtAcc
406
408
  hcs_cli/service/admin/edge.py,sha256=G39cHLPI5fUyWtn1cYVzKlpM29ftO-HTvvpPPzOKUv4,2177
407
409
  hcs_cli/service/admin/helper.py,sha256=jjdqy6GMS4aZO9JO0LyWmL0_x02yarNtJCL8a41qSeY,1329
408
410
  hcs_cli/service/admin/provider.py,sha256=XgZJ8mAb0dkHloOEuLAU1ST0h_bXNEWVZCEuOpxCoCg,1886
409
- hcs_cli/service/admin/template.py,sha256=dJczAsK2dICMmhnBQGf0Yxkg_fIizAbXhqMEmg0gNKo,762
411
+ hcs_cli/service/admin/template.py,sha256=EPtQ7BKUJyDJ0r8ZuY0_Y6khSpP_xVmcnITvH62e5DI,1072
410
412
  hcs_cli/service/admin/uag.py,sha256=9NA6wB-yoPz0SSmY-fubQHWyoraFeZFTuSMjR4LJHLc,1852
411
413
  hcs_cli/service/admin/vm.py,sha256=qm3C8pkj5MksKVuJcG-lbLVWJ1JyvaZRlCqGpH_y1fE,672
412
414
  hcs_cli/service/app_management/__init__.py,sha256=61iK5J3VA_Zaro5NoORIax1-Iqyjx02CfGLl7Ofa1Uw,25
@@ -431,7 +433,7 @@ hcs_cli/service/edgehub/__init__.py,sha256=ZKX6VVPT3DdiC--uWzA6pKlQ1TsrxoxtCVjng
431
433
  hcs_cli/service/edgehub/edgecontroller.py,sha256=hc5ps1OWrw8cZiUiU27A2tkpxvgC9FATGGE0FkhS33M,1402
432
434
  hcs_cli/service/edgehub/edgetwin.py,sha256=_Z4tSop2l_17-_hsDtljLosintKccwDeFEAkjt8ZqyQ,959
433
435
  hcs_cli/service/hoc/__init__.py,sha256=fHFaB2296HgzIKwMPkB9BDxezIYI6M4OD-woPsrtOts,48
434
- hcs_cli/service/hoc/diagnostic.py,sha256=nSpmLtT66WokKABdtoU4oYq2e3eN2j8ClMQvNCNeTV8,1144
436
+ hcs_cli/service/hoc/diagnostic.py,sha256=3sS1Saydsy-kYuF4IQMlz4scv1O4nMjnHOM7Trqh9cY,1465
435
437
  hcs_cli/service/hoc/es.py,sha256=XCeYuhGMJE89uRiH49lolCnNWMEi0Ec7VRhxKbEvAO4,3491
436
438
  hcs_cli/service/ims/__init__.py,sha256=CTtPWRJqthcWW7jMyqD-4fP09xSGEfVEj75GbrtyDsA,86
437
439
  hcs_cli/service/ims/gold_pattern.py,sha256=HAnKOHBlyoCTzpUP4H5NsqpMPX4tYKiQdtdA9yYr-CM,3160
@@ -439,15 +441,15 @@ hcs_cli/service/ims/helper.py,sha256=0LgnJAE8W3_yGG3qG1Y6DMs7VUHHhKcrjRR2Ap8cNN8
439
441
  hcs_cli/service/ims/image_copies.py,sha256=zBZbFZS0jr9Ew9KanLc10qwHnV8iy0UdU9aFYum3Jw0,968
440
442
  hcs_cli/service/ims/images.py,sha256=FIuasv4fj4EZFVF7_BFfWW7JutZO8cr6X1h5LCb0qs4,2059
441
443
  hcs_cli/service/ims/version.py,sha256=xcsb5-YvGY3duZk0wHdVPmuJjyVf01dg26VGgBQaQxY,3330
442
- hcs_cli/service/inventory/__init__.py,sha256=vncedPyru5baoOZkhe0OuSOetvg-3aUX0dikC3_oiws,166
444
+ hcs_cli/service/inventory/__init__.py,sha256=Y8pcgMOA60I3b4RjLBrLcT5zRs5rgSP5URIjL-x0nxI,651
443
445
  hcs_cli/service/inventory/session.py,sha256=VB9oCC297UmmymJ1cnbtdZoLklyi0GtjuKNnPAb5zEQ,2240
444
- hcs_cli/service/inventory/vm.py,sha256=JNVoZA1LYQS6Rm9JdAC1zu-gSkqpObvfJbUEDA7uvUo,2478
446
+ hcs_cli/service/inventory/vm.py,sha256=xktEVwelVGVBNOuUtq_rPQl356pwvUt7Je_6OsPyJDo,2936
445
447
  hcs_cli/service/iss/__init__.py,sha256=LBifjQWYf4lqZWWdKk7wfB5F4HrqD4qpu9q-iLxVtK0,631
446
448
  hcs_cli/service/iss/mqtt.py,sha256=MS7KalunXez2sRozlH47eUPuXoKqU0Ib2QOWpcLb_g4,2142
447
449
  hcs_cli/service/lcm/__init__.py,sha256=twzd41c4kLiR5mkNlsq5GNJxRE5CUG6vKlAg3qYWoL8,45
448
450
  hcs_cli/service/lcm/health.py,sha256=XHa7bmctKmjuSERxEhmNF4BbcwS4XOfjcxJU2dy9udQ,1069
449
451
  hcs_cli/service/lcm/provider.py,sha256=rwA7qoN_MGqV93TJ1-i76BuucdvXyH0DQKnoGbc6HAE,1283
450
- hcs_cli/service/lcm/template.py,sha256=89X69DDkzsn5eVz6ng5CgodNMxz79SFEbXYZbEMTXqM,4217
452
+ hcs_cli/service/lcm/template.py,sha256=phSrxGQn21ZYrRpTw-IdTkN-AfkhlXWDebfHMtpNJds,4330
451
453
  hcs_cli/service/lcm/vm.py,sha256=L75cvPYK4J_CAtTYP076q4LN2zZyJHQ8w54NfPIlsqQ,3808
452
454
  hcs_cli/service/org_service/__init__.py,sha256=akNxzmiw970PHGDLHiJjcYZnbtbGCpVFVNzXfUVbwIY,54
453
455
  hcs_cli/service/org_service/datacenter.py,sha256=XN0uv2qSLQg6kUPo9Jioz9vSr7aFYr4anQ7YgT67mWA,1182
@@ -489,11 +491,11 @@ hcs_cli/support/template_util.py,sha256=tfQuXIo-j9XYysXTaKCaBs4GF5UHxR9TOKFRF5G-
489
491
  hcs_cli/support/test_utils.py,sha256=uMiWOOgYSP7HAOPECam57EJjenrSG_2HvtxO4uzC4K0,5680
490
492
  hcs_cli/support/test_utils2.py,sha256=g321d4lNbJfy8VaSfwWjlj4_ZJe9NW6B16S8GOT3rEw,18961
491
493
  hcs_cli/support/use_util.py,sha256=QBrcNIW-k0g41euTc7-oU1WKEmACJx3YGQflyC3YeFs,2970
492
- hcs_cli/support/vm_table.py,sha256=aNyFtrQb2Cy4JBZx3sPt3_GpOHD7R6x4nITlwc9dZ4Q,2321
494
+ hcs_cli/support/vm_table.py,sha256=hqNUKLVUuBiuDwlqcAQ7uAT1-4z6ZYOIGRcFWn8lnAo,2329
493
495
  hcs_cli/support/scm/html_util.py,sha256=clgMpM90HxRRs3D9ORYYNB57AYh7y_-UzJrB4KX3dsY,458
494
496
  hcs_cli/support/scm/plan-editor.html.template,sha256=qXhHYjBsG8uaVlMkc0gnCePoSV3w5NyTkaLhXV9jlC0,26874
495
497
  hcs_cli/support/scm/plan_editor.py,sha256=pZtm9X_R-vs2JxJ_NX7-wTAoY-nhI-gFqhcyVDdEZVM,3108
496
- hcs_cli-0.1.319.dist-info/METADATA,sha256=QpyIDrY1otHMDrb1idolJ9MdX2K_x5_YpLh13TjtL8c,3614
497
- hcs_cli-0.1.319.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
498
- hcs_cli-0.1.319.dist-info/entry_points.txt,sha256=5uH-af1WUETSBSer2bu4YMGQNY5RriJHsjepb8ACiX8,42
499
- hcs_cli-0.1.319.dist-info/RECORD,,
498
+ hcs_cli-0.1.321.dist-info/METADATA,sha256=llYPP2ShA7g1sBAPChU2L8BaF62Yq0ozSKHZ0xFVieQ,3614
499
+ hcs_cli-0.1.321.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
500
+ hcs_cli-0.1.321.dist-info/entry_points.txt,sha256=5uH-af1WUETSBSer2bu4YMGQNY5RriJHsjepb8ACiX8,42
501
+ hcs_cli-0.1.321.dist-info/RECORD,,
@@ -1,67 +0,0 @@
1
- {
2
- "id": "azure-dummy",
3
- "orgId": "aecd10d9-ca4f-4af8-97fa-9d7b6f25e285",
4
- "location": "US",
5
- "region": "westus2",
6
- "name": "azure-dummy",
7
- "templateType": "FLOATING",
8
- "provisionWithAgentReady": false,
9
- "vmNamePattern": "azdummy-",
10
- "resourceManagerTemplate": "dev/dummy",
11
- "vmRefreshType": "DELETE_VM",
12
- "reuseVmIds": false,
13
- "useAZ": false,
14
- "provider": {
15
- "providerAccessId": "dev-azure"
16
- },
17
- "sparePolicy": {
18
- "increment": 600,
19
- "limit": 3,
20
- "max": 3,
21
- "min": 1
22
- },
23
- "providerType": "AZURE",
24
- "hdc": {
25
- "vmHubName": "westus2",
26
- "vmHubURL": "https://nanw.fs.devframe.cp.horizon.omnissa.com"
27
- },
28
- "edgeGateway": {
29
- "id": "abcdefghijklmnopqrstuvwx",
30
- "iotDeviceName": "syntheticIotDeviceName",
31
- "adTwinId": "syntheticAdTwinId"
32
- },
33
- "activeDirectory": {
34
- "domain": "nanw.local"
35
- },
36
- "network": {
37
- "vNetName": "nanw-vnet",
38
- "subnetName": "default",
39
- "vNetResourceGroup": "nanw-infra",
40
- "location": "westus2",
41
- "publicIpAddressType": "DYNAMIC",
42
- "publicIpAddressSku": "Basic"
43
- },
44
- "image": {
45
- "imageReference": {
46
- "publisher": "Canonical",
47
- "offer": "UbuntuServer",
48
- "sku": "18.04-LTS",
49
- "version": "latest"
50
- },
51
- "os": "linux",
52
- "guestUsername": "ubuntu",
53
- "guestPassword": "dummy-password"
54
- },
55
- "vmSpec": {
56
- "diskSize": 127,
57
- "diskType": "Standard_LRS"
58
- },
59
- "agentCustomization": {
60
- "sessionsPerVm": 1
61
- },
62
- "properties": {
63
- "azureCreateResourceGroup": true,
64
- "new-task-engine": true,
65
- "simulateAgentStatus": "AVAILABLE"
66
- }
67
- }
File without changes