Skip to content

Commit 532951a

Browse files
committed
initial changes for stack-hci vmconnect command
1 parent 55e6dbd commit 532951a

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

src/stack-hci/azext_stack_hci/commands.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,8 @@ def load_command_table(self, _): # pylint: disable=unused-argument
1919
self.command_table['stack-hci cluster create'] = ClusterCreate(loader=self)
2020
self.command_table['stack-hci cluster identity assign'] = IdentityAssign(loader=self)
2121
self.command_table['stack-hci cluster identity remove'] = IdentityRemove(loader=self)
22+
23+
with self.command_group('stack-hci vmconnect'):
24+
from azext_stack_hci.custom import VmConnectEnable, VmConnectDisable
25+
self.command_table['stack-hci vmconnect enable'] = VmConnectEnable(loader=self)
26+
self.command_table['stack-hci vmconnect disable'] = VmConnectDisable(loader=self)

src/stack-hci/azext_stack_hci/custom.py

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,137 @@ def pre_instance_update(self, instance):
7575
args = self.ctx.args
7676
if args.system_assigned:
7777
args.type = 'None'
78+
79+
80+
class VmConnectEnable:
81+
"""Enable VM Connect functionality for Stack HCI cluster."""
82+
83+
def __init__(self, loader=None):
84+
self.loader = loader
85+
86+
@classmethod
87+
def _build_arguments_schema(cls, *args, **kwargs):
88+
from azure.cli.core.aaz import AAZResourceGroupNameArg, AAZStrArg, AAZDictArg
89+
args_schema = {}
90+
args_schema.cluster_name = AAZStrArg(
91+
options=["--cluster-name", "-n"],
92+
help="The name of the cluster.",
93+
required=True
94+
)
95+
args_schema.resource_group = AAZResourceGroupNameArg(
96+
options=["--resource-group", "-g"],
97+
help="Name of resource group.",
98+
required=True
99+
)
100+
args_schema.vm_name = AAZStrArg(
101+
options=["--vm-name"],
102+
help="The name of the virtual machine.",
103+
required=True
104+
)
105+
return args_schema
106+
107+
def __call__(self, cmd, **kwargs):
108+
from azure.cli.core.commands.client_factory import get_subscription_id
109+
from azure.cli.core.util import send_raw_request
110+
import json
111+
112+
cluster_name = kwargs.get('cluster_name')
113+
resource_group = kwargs.get('resource_group')
114+
vm_name = kwargs.get('vm_name')
115+
116+
subscription_id = get_subscription_id(cmd.cli_ctx)
117+
118+
# Construct the REST API path
119+
path = f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.AzureStackHCI/clusters/{cluster_name}/jobs/VmConnectProvision"
120+
121+
# API version
122+
api_version = "2023-12-01-preview"
123+
url = f"https://management.azure.com{path}?api-version={api_version}"
124+
125+
# Default payload with VM name
126+
payload = {
127+
"properties": {
128+
"jobType": "VmConnectProvision",
129+
"deploymentMode": "Deploy",
130+
"vmConnectProvisionJobDetails": [
131+
{
132+
"vmName": vm_name
133+
}
134+
]
135+
}
136+
}
137+
138+
# Make the REST API call
139+
try:
140+
response = send_raw_request(cmd.cli_ctx, "PUT", url, body=json.dumps(payload))
141+
return response.json() if response.content else {"message": f"VM Connect provision job initiated successfully for VM: {vm_name}"}
142+
except Exception as e:
143+
from azure.cli.core.util import CLIError
144+
raise CLIError(f"Failed to enable VM Connect for VM '{vm_name}': {str(e)}")
145+
146+
147+
class VmConnectDisable:
148+
"""Disable VM Connect functionality for Stack HCI cluster."""
149+
150+
def __init__(self, loader=None):
151+
self.loader = loader
152+
153+
@classmethod
154+
def _build_arguments_schema(cls, *args, **kwargs):
155+
from azure.cli.core.aaz import AAZResourceGroupNameArg, AAZStrArg
156+
args_schema = {}
157+
args_schema.cluster_name = AAZStrArg(
158+
options=["--cluster-name", "-n"],
159+
help="The name of the cluster.",
160+
required=True
161+
)
162+
args_schema.resource_group = AAZResourceGroupNameArg(
163+
options=["--resource-group", "-g"],
164+
help="Name of resource group.",
165+
required=True
166+
)
167+
args_schema.vm_name = AAZStrArg(
168+
options=["--vm-name"],
169+
help="The name of the virtual machine.",
170+
required=True
171+
)
172+
return args_schema
173+
174+
def __call__(self, cmd, **kwargs):
175+
from azure.cli.core.commands.client_factory import get_subscription_id
176+
from azure.cli.core.util import send_raw_request
177+
import json
178+
179+
cluster_name = kwargs.get('cluster_name')
180+
resource_group = kwargs.get('resource_group')
181+
vm_name = kwargs.get('vm_name')
182+
183+
subscription_id = get_subscription_id(cmd.cli_ctx)
184+
185+
# Construct the REST API path for deprovision
186+
path = f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.AzureStackHCI/clusters/{cluster_name}/jobs/VmConnectDeprovision"
187+
188+
# API version
189+
api_version = "2023-12-01-preview"
190+
url = f"https://management.azure.com{path}?api-version={api_version}"
191+
192+
# Payload for VM Connect deprovision
193+
payload = {
194+
"properties": {
195+
"jobType": "VmConnectDeprovision",
196+
"deploymentMode": "Deploy",
197+
"vmConnectProvisionJobDetails": [
198+
{
199+
"vmName": vm_name
200+
}
201+
]
202+
}
203+
}
204+
205+
# Make the REST API call
206+
try:
207+
response = send_raw_request(cmd.cli_ctx, "PUT", url, body=json.dumps(payload))
208+
return response.json() if response.content else {"message": f"VM Connect deprovision job initiated successfully for VM: {vm_name}"}
209+
except Exception as e:
210+
from azure.cli.core.util import CLIError
211+
raise CLIError(f"Failed to disable VM Connect for VM '{vm_name}': {str(e)}")

0 commit comments

Comments
 (0)