1
0
mirror of https://github.com/vmware/vsphere-automation-sdk-python.git synced 2024-11-22 01:39:58 -05:00

Adding the deliverables for vcenter, nsx. Adding the new samples. Update the README.md, setup.py and other files for 8.0U3

Signed-off-by: Prajwal Bhagat <prajwal.bhagat@broadcom.com>
This commit is contained in:
Prajwal Bhagat 2024-07-03 13:04:43 +05:30
parent 99ee630cb8
commit b712eda86f
53 changed files with 1386 additions and 979 deletions

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2016-2023 VMware, Inc. Copyright (c) 2016-2024 Broadcom, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View File

@ -3,7 +3,7 @@
## Table of Contents ## Table of Contents
- [Abstract](#abstract) - [Abstract](#abstract)
- [Supported vCenter Releases](#supported-vcenter-releases) - [Supported vCenter Releases](#supported-onprem-vcenter-releases)
- [Supported NSX-T Releases](#supported-nsx-t-releases) - [Supported NSX-T Releases](#supported-nsx-t-releases)
- [VMware Cloud on AWS Support](#vmware-cloud-on-aws-support) - [VMware Cloud on AWS Support](#vmware-cloud-on-aws-support)
- [Quick Start Guide](#quick-start-guide) - [Quick Start Guide](#quick-start-guide)
@ -22,11 +22,11 @@ samples require the vSphere Management SDK packages (pyVmomi) to be installed on
The samples have been developed to work with python 3.8+ The samples have been developed to work with python 3.8+
## Supported OnPrem vCenter Releases ## Supported OnPrem vCenter Releases
vCenter 7.0, 7.0U1, 7.0U2, 7.0U3 , 8.0, 8.0U1, 8.0U2 vCenter 7.0, 7.0U1, 7.0U2, 7.0U3 , 8.0, 8.0U1, 8.0U2, 8.0U3
Please refer to the notes in each sample for detailed compatibility information. Please refer to the notes in each sample for detailed compatibility information.
## Supported NSX-T Releases ## Supported NSX-T Releases
NSX-T 2.2 - 4.1.2 and VMC 1.7 - 1.24 NSX-T 2.2 - 4.2.0 and VMC 1.7 - 1.24
## Latest VMware Cloud on AWS Release: ## Latest VMware Cloud on AWS Release:
VMC M24 (1.24) ([Release Notes](https://docs.vmware.com/en/VMware-Cloud-on-AWS/0/rn/vmc-on-aws-relnotes.html)) VMC M24 (1.24) ([Release Notes](https://docs.vmware.com/en/VMware-Cloud-on-AWS/0/rn/vmc-on-aws-relnotes.html))
@ -264,9 +264,10 @@ $ python samples/vsphere/vcenter/vm/list_vms.py -v
### vSphere API Documentation ### vSphere API Documentation
* [VMware vSphere REST API Reference documentation](https://developer.vmware.com/docs/vsphere-automation/latest/) * [VMware vSphere REST API Reference documentation](https://developer.broadcom.com/xapis/vsphere-automation-api/latest/)
* [vSphere 8.0 U2 Python APIs (latest)](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.2.0/) * [vSphere 8.0 U3 Python APIs (latest)](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.3.0/)
* Previous Releases: vSphere [8.0 U1](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.1.0/) * Previous Releases: vSphere [8.0 U2](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.2.0/)
[8.0 U1](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.1.0/)
[8.0 GA](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.0.1/) [8.0 GA](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.0.1/)
[8.0.0.0](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.0.0/), [8.0.0.0](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/8.0.0.0/),
[7.0 U3](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/7.0.3.0/) [7.0 U3](https://vmware.github.io/vsphere-automation-sdk-python/vsphere/7.0.3.0/)
@ -274,7 +275,7 @@ $ python samples/vsphere/vcenter/vm/list_vms.py -v
### VMware Cloud on AWS API Documentation ### VMware Cloud on AWS API Documentation
* [VMware Cloud on AWS REST APIs](http://developers.eng.vmware.com/docs/vmc/latest/) * [VMware Cloud on AWS REST APIs](https://developer.broadcom.com/xapis/vmware-cloud-on-aws-api-reference/latest/)
* [VMware Cloud on AWS Console Python APIs](https://vmware.github.io/vsphere-automation-sdk-python/vmc/index.html) * [VMware Cloud on AWS Console Python APIs](https://vmware.github.io/vsphere-automation-sdk-python/vmc/index.html)
* [VMware Cloud on AWS Disaster Recovery as a Service (DRaaS) Python APIs](https://vmware.github.io/vsphere-automation-sdk-python/vmc-draas/index.html) * [VMware Cloud on AWS Disaster Recovery as a Service (DRaaS) Python APIs](https://vmware.github.io/vsphere-automation-sdk-python/vmc-draas/index.html)
@ -313,5 +314,5 @@ Members:
* [VMware Sample Exchange](https://code.vmware.com/samples) It is highly recommended to add any and all submitted samples to the VMware Sample Exchange * [VMware Sample Exchange](https://code.vmware.com/samples) It is highly recommended to add any and all submitted samples to the VMware Sample Exchange
* [VMware Code](https://code.vmware.com/home) * [VMware Code](https://code.vmware.com/home)
* [VMware Developer Community](https://communities.vmware.com/community/vmtn/developer) * [VMware Developer Community](https://communities.vmware.com/community/vmtn/developer)
* VMware vSphere [REST API Reference documentation](https://developer.vmware.com/docs/vsphere-automation/latest/). * VMware vSphere [REST API Reference documentation](https://developer.broadcom.com/xapis/vsphere-automation-api/latest/).
* [VMware Python forum](https://code.vmware.com/forums/7508/vsphere-automation-sdk-for-python) * [VMware Python forum](https://code.vmware.com/forums/7508/vsphere-automation-sdk-for-python)

View File

@ -4,11 +4,8 @@ For python developers, client libraries are supplied for testing and development
Name | Description Name | Description
------------------------------------| ------------- ------------------------------------| -------------
vapi_runtime | vAPI runtime responsible for serialization/de-serialization of objects and wire protocol
vcenter_bindings | Client stubs for vSphere Automation APIs
vmwarecloud_aws | Client stubs for VMware Cloud on AWS Console APIs vmwarecloud_aws | Client stubs for VMware Cloud on AWS Console APIs
vmwarecloud_draas | Client stubs for VMware Cloud (VMC) Disaster Recovery as a Service (DRaaS) APIs vmwarecloud_draas | Client stubs for VMware Cloud (VMC) Disaster Recovery as a Service (DRaaS) APIs
nsx-python-sdk | Client stubs for VMware NSX-T APIs nsx-python-sdk | Client stubs for VMware NSX-T APIs
nsx-vmc-policy-python-sdk | Client stubs for VMware NSX-T on VMC Policy APIs nsx-vmc-policy-python-sdk | Client stubs for VMware NSX-T on VMC Policy APIs
nsx-vmc-aws-integration-python-sdk | Client stubs for VMware NSX-T AWS integration app APIs (for AWS underlay management) nsx-vmc-aws-integration-python-sdk | Client stubs for VMware NSX-T AWS integration app APIs (for AWS underlay management)
vapi-common-client | Common client code libraries

View File

@ -3,10 +3,8 @@
<meta name='api-version' value='2'/> <meta name='api-version' value='2'/>
</head> </head>
<body> <body>
<a href='vcenter-bindings/'>vcenter-bindings</a><br/>
<a href='vmwarecloud-aws/'>vmwarecloud-aws</a><br/> <a href='vmwarecloud-aws/'>vmwarecloud-aws</a><br/>
<a href='vmwarecloud-draas/'>vmwarecloud-draas</a><br/> <a href='vmwarecloud-draas/'>vmwarecloud-draas</a><br/>
<a href='vapi-runtime/'>vapi-runtime</a><br/>
<a href='nsx-python-sdk/'>nsx-python-sdk</a><br/> <a href='nsx-python-sdk/'>nsx-python-sdk</a><br/>
<a href='nsx-policy-python-sdk/'>nsx-policy-python-sdk</a><br/> <a href='nsx-policy-python-sdk/'>nsx-policy-python-sdk</a><br/>
<a href='nsx-vmc-policy-python-sdk/'>nsx-vmc-policy-python-sdk</a><br/> <a href='nsx-vmc-policy-python-sdk/'>nsx-vmc-policy-python-sdk</a><br/>

View File

@ -1 +1 @@
<a href='nsx_policy_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'>nsx_policy_python_sdk-4.1.2.0.0-py2.py3-none-any.whl</a><br /> <a href='nsx_policy_python_sdk-4.2.0-py2.py3-none-any.whl'>nsx_policy_python_sdk-4.2.0-py2.py3-none-any.whl</a><br />

View File

@ -1 +1 @@
<a href='nsx_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'>nsx_python_sdk-4.1.2.0.0-py2.py3-none-any.whl</a><br /> <a href='nsx_python_sdk-4.2.0-py2.py3-none-any.whl'>nsx_python_sdk-4.2.0-py2.py3-none-any.whl</a><br />

View File

@ -1 +1 @@
<a href='nsx_vmc_aws_integration_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'>nsx_vmc_aws_integration_python_sdk-4.1.2.0.0-py2.py3-none-any.whl</a><br /> <a href='nsx_vmc_aws_integration_python_sdk-4.1.2.0.1-py2.py3-none-any.whl'>nsx_vmc_aws_integration_python_sdk-4.1.2.0.1-py2.py3-none-any.whl</a><br />

View File

@ -1 +1 @@
<a href='nsx_vmc_policy_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'>nsx_vmc_policy_python_sdk-4.1.2.0.0-py2.py3-none-any.whl</a><br /> <a href='nsx_vmc_policy_python_sdk-4.1.2.0.1-py2.py3-none-any.whl'>nsx_vmc_policy_python_sdk-4.1.2.0.1-py2.py3-none-any.whl</a><br />

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
<a href='vmwarecloud_aws-1.64.0-py2.py3-none-any.whl'>vmwarecloud_aws-1.64.0-py2.py3-none-any.whl</a><br /> <a href='vmwarecloud_aws-1.64.1-py2.py3-none-any.whl'>vmwarecloud_aws-1.64.1-py2.py3-none-any.whl</a><br />

View File

@ -1 +1 @@
<a href='vmwarecloud_draas-1.23.0-py2.py3-none-any.whl'>vmwarecloud_draas-1.23.0-py3.py3-none-any.whl</a><br /> <a href='vmwarecloud_draas-1.23.1-py2.py3-none-any.whl'>vmwarecloud_draas-1.23.1-py3.py3-none-any.whl</a><br />

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,5 @@
###### Common requirements ###### ###### Common requirements ######
lxml >= 4.3.0 lxml >= 4.3.0
pyVmomi >=6.7
six (>=1.12) six (>=1.12)
requests (>=2.27.1) requests (>=2.27.1)
@ -8,7 +7,8 @@ pyOpenSSL (>=22.0.0)
cryptography (>=37.0.2) cryptography (>=37.0.2)
setuptools (>=62.3.2) setuptools (>=62.3.2)
###### SDK requirements ###### ###### SDK requirements ######
vcenter-bindings == 4.2.0 pyVmomi >=8.0.3.0.1
vmware-vcenter == 8.0.3.0
vmwarecloud-aws vmwarecloud-aws
nsx-python-sdk nsx-python-sdk
nsx-policy-python-sdk nsx-policy-python-sdk

View File

@ -1,9 +1,13 @@
###### This requirements file is used for local installation where access to GitHub is restricted ###### ###### This requirements file is used for local installation where access to GitHub is restricted ######
###### Common requirements ###### ###### Common requirements ######
lxml >= 4.3.0 lxml >= 4.3.0
pyVmomi >=6.7
six (>=1.12) six (>=1.12)
requests (>=2.27.1) requests (>=2.27.1)
pyOpenSSL (>=22.0.0) pyOpenSSL (>=22.0.0)
cryptography (>=37.0.2) cryptography (>=37.0.2)
setuptools (>=62.3.2) setuptools (>=62.3.2)
###### SDK requirements ######
pyVmomi >= 8.0.3.0.1
vmware-vcenter == 8.0.3.0
vmware-vapi-runtime == 2.52.0
vmware-vapi-common-client == 2.52.0

View File

@ -0,0 +1,37 @@
This directory contains samples for snapservice APIs:
1. Protection Group Create, List and Delete operations:
Sample | Description
-------------------------------------|---------------------------------------------------
list_protection_groups.py | Demonstrates listing protection groups
create_protection_group.py | Demonstrates creating protection group
delete_protection_groups.py | Demonstrates deleting protection groups
2. Protection Group Snapshot Delete operations:
Sample | Description
-------------------------------------|---------------------------------------------------
delete_protection_group_snapshots.py | Demonstrates deleting protection group snapshots
### To view the available command-line options:
$ python protection_group/list_protection_groups.py --help
$ python protection_group/create_protection_group.py --help
$ python protection_group/delete_protection_groups.py --help
$ python snapshot/delete_protection_group_snapshots.py --help
### Running the samples:
Fill "Snapservice protection group creation spec" section in vcenter/setup/testbed.py when calling create_pg.py
$ python protection_group/list_protection_groups.py --server <vCenter Server IP> --username <username> --password <password> --snapservice <snapservice IP> --cluster <cluster name> -v
$ python protection_group/create_protection_group.py --server <vCenter Server IP> --username <username> --password <password> --snapservice <snapservice IP> --cluster <cluster name> -v
$ python protection_group/create_protection_group.py --server <vCenter Server IP> --username <username> --password <password> --snapservice <snapservice IP> --cluster <cluster name> -v -c
$ python protection_group/delete_protection_groups.py --server <vCenter Server IP> --username <username> --password <password> --snapservice <snapservice IP> --cluster <cluster name> --pgnames <protection groups name to delete> -v
$ python protection_group/delete_protection_groups.py --server <vCenter Server IP> --username <username> --password <password> --snapservice <snapservice IP> --cluster <cluster name> --pgnames <protection groups name to delete> -v --force
$ python snapshot/delete_protection_group_snapshots.py --server <vCenter Server IP> --username <username> --password <password> --snapservice <snapservice IP> --cluster <cluster name> --pgname <protection group name to delete snapshot> --remain <snapshot remain> -v
### Testbed Requirement:
- vCenter Server >= 8.0.3+
- vSAN ESA disk
- vSAN Cluster
- Snapservice = 8.0.3

View File

@ -0,0 +1,25 @@
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__copyright__ = 'Copyright (c) 2024 Broadcom. All Rights Reserved.'
# Required to distribute different parts of this
# package as multiple distribution
try:
import pkg_resources
pkg_resources.declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__) # @ReservedAssignment

View File

@ -0,0 +1,25 @@
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__copyright__ = 'Copyright (c) 2024 Broadcom. All Rights Reserved.'
# Required to distribute different parts of this
# package as multiple distribution
try:
import pkg_resources
pkg_resources.declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__) # @ReservedAssignment

View File

@ -0,0 +1,148 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__vcenter_version__ = '8.0.3+'
import time
from samples.vsphere.common import sample_cli
from samples.vsphere.common import sample_util
from samples.vsphere.common.ssl_helper import get_unverified_session
from samples.vsphere.vcenter.setup import testbed
from samples.vsan.snapservice.vsan_snapservice_client import create_snapservice_client
from vmware.vapi.vsphere.client import create_vsphere_client
from com.vmware.vcenter_client import (Cluster, VM)
from com.vmware.snapservice_client import *
from com.vmware.snapservice.clusters_client import *
from com.vmware.snapservice.tasks_client import Status
class CreateProtectionGroup(object):
"""
Description: Demonstrates creating protection group.
"""
def __init__(self):
parser = sample_cli.build_arg_parser()
required_args = parser.add_argument_group(
'snapservice required arguments')
required_args.add_argument('--snapservice',
action='store',
required=True,
help='Snapservice IP/hostname to connect to')
required_args.add_argument('--cluster',
action='store',
required=True,
help='Cluster where the protection group locates')
args = sample_util.process_cli_args(parser.parse_args())
self.cluster = args.cluster
self.cleardata = args.cleardata
skipverification = True if args.skipverification else False
vcSession = get_unverified_session() if skipverification else None
self.vcClient = create_vsphere_client(server=args.server,
username=args.username,
password=args.password,
session=vcSession)
ssSession = get_unverified_session() if skipverification else None
self.ssClient = create_snapservice_client(server=args.snapservice,
vc=args.server,
username=args.username,
password=args.password,
session=ssSession,
skip_verification=skipverification)
def run(self):
# Get cluster identifier
cluster_spec = set([self.cluster])
cluster_list = self.vcClient.vcenter.Cluster.list(
Cluster.FilterSpec(names=cluster_spec))
clusterId = cluster_list[0].cluster
self.clusterId = clusterId
print("\nGot cluster '{}' id: {}".format(self.cluster, clusterId))
# Get vm identifier
vm_names = set(testbed.config["VM_NAMES"].split(","))
vm_list = self.vcClient.vcenter.VM.list(VM.FilterSpec(names=vm_names))
vm_ids = []
for vm_info in vm_list:
vm_ids.append(vm_info.vm)
print("\nGot VM list: {}".format(vm_ids))
# Get vm formats
vm_formats = testbed.config["VM_FORMATS"].split(",")
# Build protection group Spec
target_entities = TargetEntities(vm_name_patterns=vm_formats, vms=set(vm_ids))
snapshot_policies = [SnapshotPolicy(name='policy1',
schedule=SnapshotSchedule(
TimeUnit(testbed.config["SCHEDULE_UNIT"]),
testbed.config["SCHEDULE"]),
retention=RetentionPeriod(
TimeUnit(testbed.config["RETENTION_UNIT"]),
testbed.config["RETENTION"]))]
locked = testbed.config["LOCK"]
spec = ProtectionGroupSpec(name=testbed.config["PG_NAME"],
target_entities=target_entities,
snapshot_policies=snapshot_policies,
locked=locked)
print("\n###Creating protection group with spec:\n")
print(spec)
# Wait for task to complete.
task = self.ssClient.snapservice.clusters.ProtectionGroups.create_task(clusterId, spec=spec)
while True:
task_info = self.ssClient.snapservice.Tasks.get(task.get_task_id())
if task_info.status == Status.SUCCEEDED:
print("\n###Creation task {} succeeds.".format(task_info.description.id))
return
elif task_info.status == Status.FAILED:
print("\n###Creation task {} fails.\nError:\n".format(task_info.description.id))
print(task_info.error)
return
else:
print("\n###Creation task {} progress: {}".format(task_info.description.id,
task_info.progress.completed))
time.sleep(5)
def cleanup(self):
pgs_info = self.ssClient.snapservice.clusters.ProtectionGroups.list(self.clusterId)
for pg_info in pgs_info.items:
if pg_info.info.name == testbed.config["PG_NAME"] and not testbed.config["LOCK"]:
print("\n###Deleting created PG {}".format(testbed.config["PG_NAME"]))
self.ssClient.snapservice.clusters.ProtectionGroups.delete_task(
self.clusterId, pg_info.pg, ProtectionGroups.DeleteSpec(force=True))
def main():
create_pg = CreateProtectionGroup()
create_pg.run()
if create_pg.cleardata:
create_pg.cleanup()
if __name__ == '__main__':
main()

View File

@ -0,0 +1,141 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__vcenter_version__ = '8.0.3+'
import time
from samples.vsphere.common import sample_cli
from samples.vsphere.common import sample_util
from samples.vsphere.common.ssl_helper import get_unverified_session
from samples.vsan.snapservice.vsan_snapservice_client import create_snapservice_client
from vmware.vapi.vsphere.client import create_vsphere_client
from com.vmware.vcenter_client import Cluster
from com.vmware.snapservice_client import *
from com.vmware.snapservice.clusters_client import *
from com.vmware.snapservice.tasks_client import Status
class DeleteProtectionGroups(object):
"""
Description: Demonstrates deleting protection groups.
"""
def __init__(self):
parser = sample_cli.build_arg_parser()
required_args = parser.add_argument_group(
'snapservice required arguments')
required_args.add_argument('--snapservice',
action='store',
required=True,
help='Snapservice IP/hostname to connect to')
required_args.add_argument('--cluster',
action='store',
required=True,
help='Cluster where the protection group locates')
required_args.add_argument('--pgnames',
action='store',
required=True,
help='Protection groups to delete, separate with comma.')
parser.add_argument_group('snapservice optional arguments')\
.add_argument('--force',
action='store_true',
help='Whether delete protection group snapshots')
args = sample_util.process_cli_args(parser.parse_args())
self.cluster = args.cluster
self.pgnames = args.pgnames
self.force = True if args.force else False
skipverification = True if args.skipverification else False
vcSession = get_unverified_session() if skipverification else None
self.vcClient = create_vsphere_client(server=args.server,
username=args.username,
password=args.password,
session=vcSession)
ssSession = get_unverified_session() if skipverification else None
self.ssClient = create_snapservice_client(server=args.snapservice,
vc=args.server,
username=args.username,
password=args.password,
session=ssSession,
skip_verification=skipverification)
def run(self):
# Get cluster identifier
cluster_spec = set([self.cluster])
cluster_list = self.vcClient.vcenter.Cluster.list(
Cluster.FilterSpec(names=cluster_spec))
clusterId = cluster_list[0].cluster
print("\nGot cluster '{}' id: {}".format(self.cluster, clusterId))
pg_names = self.pgnames.split(",")
pgs_info = self.ssClient.snapservice.clusters.ProtectionGroups.list(clusterId)
tasks = []
for pg_info in pgs_info.items:
if pg_info.info.name in pg_names:
if pg_info.info.locked:
print("\nProtection group '{}' is mutabl, skip the deletion."
.format(pg_info.info.name))
elif pg_info.info.status == ProtectionGroupStatus.MARKED_FOR_DELETE:
print("\nProtection group '{}' is marked as deleted, skip the "
"deletion.".format(pg_info.info.name))
else:
print("\nDeleting protection group '{}' : '{}'"
.format(pg_info.info.name, pg_info.pg))
task = self.ssClient.snapservice.clusters.ProtectionGroups.delete_task(
clusterId, pg_info.pg, ProtectionGroups.DeleteSpec(force=self.force))
print("Task id: {}\n".format(task.get_task_id()))
tasks.append(task.get_task_id())
taskCompleted = 0
while True:
for taskId in tasks:
task_info = self.ssClient.snapservice.Tasks.get(taskId)
if task_info.status == Status.SUCCEEDED:
print("\n###Deletion task {} succeeds.".format(task_info.description.id))
taskCompleted += 1
elif task_info.status == Status.FAILED:
print("\n###Deletion task {} fails.\nError:\n".format(task_info.description.id))
print(task_info.getResult())
taskCompleted += 1
else:
print("\n###Deletion task {} progress: ".format(task_info.description.progress))
if taskCompleted >= len(tasks):
print("\n\n###All protection group deletion jobs are completed")
break
time.sleep(5)
def main():
delete_pg = DeleteProtectionGroups()
delete_pg.run()
if __name__ == '__main__':
main()

View File

@ -0,0 +1,89 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__vcenter_version__ = '8.0.3+'
from samples.vsphere.common import sample_cli
from samples.vsphere.common import sample_util
from samples.vsphere.common.ssl_helper import get_unverified_session
from samples.vsan.snapservice.vsan_snapservice_client import create_snapservice_client
from vmware.vapi.vsphere.client import create_vsphere_client
from com.vmware.vcenter_client import Cluster
from com.vmware.snapservice_client import *
from com.vmware.snapservice.clusters_client import *
class ListProtectionGroups(object):
"""
Description: Demonstrates listing protection groups.
"""
def __init__(self):
parser = sample_cli.build_arg_parser()
required_args = parser.add_argument_group(
'snapservice required arguments')
required_args.add_argument('--snapservice',
action='store',
required=True,
help='Snapservice IP/hostname to connect to')
required_args.add_argument('--cluster',
action='store',
required=True,
help='Cluster where the protection group locates')
args = sample_util.process_cli_args(parser.parse_args())
self.cluster = args.cluster
skipverification = True if args.skipverification else False
vcSession = get_unverified_session() if skipverification else None
self.vcClient = create_vsphere_client(server=args.server,
username=args.username,
password=args.password,
session=vcSession)
ssSession = get_unverified_session() if skipverification else None
self.ssClient = create_snapservice_client(server=args.snapservice,
vc=args.server,
username=args.username,
password=args.password,
session=ssSession,
skip_verification=skipverification)
def run(self):
# Get cluster identifier
cluster_spec = set([self.cluster])
cluster_list = self.vcClient.vcenter.Cluster.list(
Cluster.FilterSpec(names=cluster_spec))
clusterId = cluster_list[0].cluster
print("\nGot cluster '{}' id: {}".format(self.cluster, clusterId))
pgs_info = self.ssClient.snapservice.clusters.ProtectionGroups.list(clusterId)
print("\n\nList of protection groups:\n")
for pg_info in pgs_info.items:
print(pg_info)
print("----------------------------------------\n")
def main():
list_pg = ListProtectionGroups()
list_pg.run()
if __name__ == '__main__':
main()

View File

@ -0,0 +1,25 @@
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__copyright__ = 'Copyright (c) 2024 Broadcom. All Rights Reserved.'
# Required to distribute different parts of this
# package as multiple distribution
try:
import pkg_resources
pkg_resources.declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__) # @ReservedAssignment

View File

@ -0,0 +1,126 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__vcenter_version__ = '8.0.3+'
from samples.vsphere.common import sample_cli
from samples.vsphere.common import sample_util
from samples.vsphere.common.ssl_helper import get_unverified_session
from samples.vsan.snapservice.vsan_snapservice_client import create_snapservice_client
from vmware.vapi.vsphere.client import create_vsphere_client
from com.vmware.vcenter_client import Cluster
from com.vmware.snapservice_client import *
from com.vmware.snapservice.clusters_client import *
class DeleteProtectionGroupSnapshots(object):
"""
Description: Demonstrates deleting protection group snapshots.
"""
def __init__(self):
parser = sample_cli.build_arg_parser()
required_args = parser.add_argument_group(
'snapservice required arguments')
required_args.add_argument('--snapservice',
action='store',
required=True,
help='Snapservice IP/hostname to connect to')
required_args.add_argument('--cluster',
action='store',
required=True,
help='Cluster where the protection group locates')
required_args.add_argument('--pgname',
action='store',
required=True,
help='Protection group to delete snapshot')
parser.add_argument_group('snapservice optional arguments')\
.add_argument('--remain',
action='store',
help='How many protection group snapshots to leave')
args = sample_util.process_cli_args(parser.parse_args())
self.cluster = args.cluster
self.pgname = args.pgname
self.remain = int(args.remain) if int(args.remain) > 0 else 0
skipverification = True if args.skipverification else False
vcSession = get_unverified_session() if skipverification else None
self.vcClient = create_vsphere_client(server=args.server,
username=args.username,
password=args.password,
session=vcSession)
ssSession = get_unverified_session() if skipverification else None
self.ssClient = create_snapservice_client(server=args.snapservice,
vc=args.server,
username=args.username,
password=args.password,
session=ssSession,
skip_verification=skipverification)
def run(self):
# Get cluster identifier
cluster_spec = set([self.cluster])
cluster_list = self.vcClient.vcenter.Cluster.list(
Cluster.FilterSpec(names=cluster_spec))
clusterId = cluster_list[0].cluster
print("\nGot cluster '{}' id: {}".format(self.cluster, clusterId))
# Get protection group identifier
pgs_info = self.ssClient.snapservice.clusters.ProtectionGroups.list(clusterId)
pgId = 0
for pg_info in pgs_info.items:
if pg_info.info.name == self.pgname:
pgId = pg_info.pg
print("\nProtection groups '{}': '{}'\n".format(self.pgname, pgId))
# Get protection group snapshots
snapshots_info = self.ssClient.snapservice.clusters.protection_groups\
.Snapshots.list(clusterId, pgId)
print("\n\nGet snapshots:\n{}".format(snapshots_info))
# Get snapshot to delete
snapshotTimeMap = {}
for snapshot in snapshots_info.snapshots:
snapshotTimeMap[snapshot.info.expires_at] = snapshot.snapshot
timeToDel = []
if self.remain == 0:
timeToDel = sorted(snapshotTimeMap)
elif self.remain < len(snapshotTimeMap):
timeToDel = sorted(snapshotTimeMap)[0:-self.remain]
else:
print("\n\n No snapshot to delete.\n")
for time in timeToDel:
print("\n\n##Deleting pg snapshot '{}' which will expire at '{}'"
.format(snapshotTimeMap[time], time))
task = self.ssClient.snapservice.clusters.protection_groups\
.Snapshots.delete(clusterId, pgId, snapshotTimeMap[time])
def main():
delete_pg_snapshot = DeleteProtectionGroupSnapshots()
delete_pg_snapshot.run()
if __name__ == '__main__':
main()

View File

@ -0,0 +1,137 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom, Inc.'
__vcenter_version__ = '8.0.3+'
import requests
import ssl
from pyVim import sso
from com.vmware.snapservice.clusters_client import StubFactory as clusters_factory
from com.vmware.snapservice.info_client import StubFactory as info_factory
from com.vmware.snapservice.tasks_client import StubFactory as tasks_factory
from vmware.vapi.bindings.stub import ApiClient
from vmware.vapi.bindings.stub import StubFactoryBase
from vmware.vapi.lib.connect import get_requests_connector
from vmware.vapi.security.client.security_context_filter import \
LegacySecurityContextFilter
from vmware.vapi.security.sso import create_saml_bearer_security_context
from vmware.vapi.stdlib.client.factories import StubConfigurationFactory
JSON_RPC_ENDPOINT = '/api'
class StubFactory(StubFactoryBase):
def __init__(self, stub_config):
StubFactoryBase.__init__(self, stub_config)
self.snapservice.clusters = clusters_factory(stub_config)
self.snapservice.info = info_factory(stub_config)
self.snapservice.tasks = tasks_factory(stub_config)
_attrs = {
'snapservice': 'com.vmware.snapservice_client.StubFactory',
}
class SnapserviceClient(ApiClient):
"""
Snapservice Client class that provides access to stubs for all services in
the snapservice API
"""
def __init__(self, session, server, bearer_token):
"""
Initialize SnapserviceClient by creating a parent stub factory instance
of all snapservice components.
:type session: :class:`requests.Session`
:param session: Requests HTTP session instance. If not specified,
then one is automatically created and used
:type server: :class:`str`
:param server: snapservice appliance host name or IP address
:type bearer_token: :class:`str`
:param bearer_token: SAML Bearer Token
"""
if not session:
session = requests.Session()
self.session = session
host_url = "https://" + server + JSON_RPC_ENDPOINT
if bearer_token is None:
raise "Please provide bearer_token to authenticate snapservice"
sec_ctx = create_saml_bearer_security_context(bearer_token)
stub_config = StubConfigurationFactory.new_std_configuration(
get_requests_connector(
session=session, url=host_url,
provider_filter_chain=[
LegacySecurityContextFilter(
security_context=sec_ctx)]))
stub_factory = StubFactory(stub_config)
ApiClient.__init__(self, stub_factory)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.__del__()
def __del__(self):
if hasattr(self, 'session'):
self.session.close()
def create_snapservice_client(server, vc, username, password, session,
skip_verification=True):
"""
Helper method to create an instance of the snapservice client.
Currently, snapservice only support bearer token to authenticate. So
acqure bearer token from sso and then create the snapservice client.
:type server: :class:`str`
:param server: snapservice appliance host name or IP address
:type vc: :class:`str`
:param vc: vCenter server host name or IP address
:type username: :class:`str`
:param username: username to the vCenter server
:type password: :class:`str`
:param password: password of the username
:type session: :class:`requests.Session` or ``None``
:param session: Requests HTTP session instance. If not specified,
then one is automatically created and used
"""
# Acquire token from sso.
sso_url = 'https://' + vc + '/sts/STSService'
authenticator = sso.SsoAuthenticator(sso_url)
context = None
if skip_verification:
if hasattr(ssl, '_create_unverified_context'):
context = ssl._create_unverified_context()
# The token lifetime is 30 minutes.
print("\n\nAcquire SAML token from PSC.\n")
saml_token = authenticator.get_bearer_saml_assertion(username,
password,
token_duration=30 * 60,
delegatable=True,
ssl_context=context)
return SnapserviceClient(session=session, server=server, bearer_token=saml_token)

View File

@ -1,6 +1,8 @@
""" """
* ******************************************************* * *******************************************************
* Copyright (c) VMware, Inc. 2013. All Rights Reserved. * Copyright (c) 2013, 2024 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc.
* and/or its subsidiaries.
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* ******************************************************* * *******************************************************
* *
@ -11,13 +13,14 @@
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. * NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
""" """
__author__ = 'VMware, Inc.' __author__ = 'Broadcom, Inc.'
__copyright__ = 'Copyright 2013 VMware, Inc. All rights reserved.' __copyright__ = 'Copyright 2013, 2024 Broadcom, Inc. All rights reserved.'
import os import os
from deprecated import deprecated
from suds.client import Client from suds.client import Client
@deprecated(version='8.0U3', reason='Use well-known endpoint URLs instead of looking them up.')
class LookupServiceHelper(object): class LookupServiceHelper(object):
def __init__(self, wsdl_url, soap_url, skip_verification): def __init__(self, wsdl_url, soap_url, skip_verification):
self.wsdl_url = wsdl_url self.wsdl_url = wsdl_url

View File

@ -1,6 +1,8 @@
""" """
* ******************************************************* * *******************************************************
* Copyright (c) VMware, Inc. 2013, 2016. All Rights Reserved. * Copyright (c) 2024 Broadcom. All Rights Reserved.
* Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc.
* and/or its subsidiaries.
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* ******************************************************* * *******************************************************
* *
@ -11,8 +13,10 @@
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. * NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
""" """
__author__ = 'VMware, Inc.' __author__ = 'Broadcom, Inc.'
__copyright__ = 'Copyright 2013, 2016 VMware, Inc. All rights reserved.' __copyright__ = 'Copyright 2013, 2016, 2024 Broadcom, Inc. All rights reserved.'
from deprecated import deprecated
from vmware.vapi.security.sso import create_saml_bearer_security_context from vmware.vapi.security.sso import create_saml_bearer_security_context
from samples.vsphere.common import sso from samples.vsphere.common import sso
@ -20,7 +24,7 @@ from samples.vsphere.common.lookup_service_helper import LookupServiceHelper
from samples.vsphere.common.ssl_helper import get_unverified_context from samples.vsphere.common.ssl_helper import get_unverified_context
@deprecated(version='8.0U3', reason='External PSC is no longer supported since vCenter 7.0. Use well-known endpoint URLs instead of looking them up.')
class PlatformServiceController(object): class PlatformServiceController(object):
""" """
Manages services on the infrastructure node (e.g. lookup service, SSO etc.) Manages services on the infrastructure node (e.g. lookup service, SSO etc.)

View File

@ -0,0 +1,37 @@
This directory contains sample for getting TPM information using Trust Authority APIs added in __vcenter_version__ = '8.0+'
* Get ESX TPM information - tpm_info.py
Running the samples
$ python <sample-dir>/<sample>.py --server <vCenter Server IP> --username <username> --password <password> <additional-sample-parameters>
* Testbed Requirement:
- 1 vCenter Server
- 1 ESX host with TPM enabled
* Sample output
python samples/vsphere/hardwaretpm/tpm_info.py -s <vCenter Server IP> -u <username> -p <password> --skipverification
vcenter server = <ip>
vc username = <username>
----------------------------
TPM Information
----------------------------
'major_version: 2'
'minor_version: 0'
'active: True'
'manufacturer: NTC'
'model: rls'
'firmware_version: 1.3.1.0'
----------------------------
----------------------------
TPM Endorsement key
----------------------------
('-----BEGIN PUBLIC KEY-----\n'
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1I65uMJU5MugQzl3K6yg\n'
'Zjzed6aP7MX1Cl670NsvMSXs4FRdNZ1wkJHFUHrSG6ihBmHoziqWKhMjv3g9qrmJ\n'
'tGR6uGsDi2nFsjn0/AK5epDQsQC6FffE6OotqAMtx+MocuU6XOacZ0lyjUcVGZRX\n'
'RLK1TmRL3ugupFDe0XLcQZPNzv4cYNLub3prYEgEcpac89xVEn/TCyRK/nMGTHxs\n'
'Z1oMI+FjpKMh5Vj/6c2gwhoX7tYQFXZOLy6S9prok5fWgHssZAjQNLjp1rihVpp3\n'
'6BIkCBRw+LSEdz47naOsZN7NEYO78It3JGlPt2fpYVJ6+/8ObUa5Sv8svzFOb0Qq\n'
'rQIDAQAB\n'
'-----END PUBLIC KEY-----\n')
----------------------------

View File

@ -0,0 +1,96 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc.
* and/or its subsidiaries.
* SPDX-License-Identifier: MIT
* *******************************************************
"""
__author__ = 'Broadcom, Inc.'
__vcenter_version__ = '8.0+'
from pprint import pprint
from com.vmware.vcenter.trusted_infrastructure.hosts.hardware_client import Tpm
from com.vmware.vcenter.trusted_infrastructure.hosts.hardware.tpm_client import EndorsementKeys
from vmware.vapi.vsphere.client import create_vsphere_client
from samples.vsphere.common import sample_cli
from samples.vsphere.common import sample_util
from samples.vsphere.common import vapiconnect
from samples.vsphere.common.ssl_helper import get_unverified_session
class TPMInfo(object):
"""
Demonstrates how to get TPM Information for the Host
attached to vCenter.
Sample Prerequisites:
vCenter/ESX(TPM enabled)
"""
def __init__(self):
self.stub_config = None
self.hostId = None
parser = sample_cli.build_arg_parser()
args = sample_util.process_cli_args(parser.parse_args())
session = get_unverified_session() if args.skipverification else None
# Login to vSphere client to get attached Host information.
self.client = create_vsphere_client(server=args.server,
username=args.username,
password=args.password,
session=session)
for host in self.client.vcenter.Host.list():
self.hostId = host.host
# Connect to the trusted infrastructure services.
self.stub_config = vapiconnect.connect(host=args.server,
user=args.username,
pwd=args.password,
skip_verification=args.skipverification)
self.tpm_svc = Tpm(self.stub_config)
self.ek_svc = EndorsementKeys(self.stub_config)
def run(self):
tpmList = self.tpm_svc.list(self.hostId)
for tpm in tpmList:
tpmId = tpm.tpm
tpmInfo = self.tpm_svc.get(self.hostId, tpmId)
print("----------------------------")
print("TPM Information")
print("----------------------------")
pprint("major_version: %s" % tpmInfo.major_version)
pprint("minor_version: %s" % tpmInfo.minor_version)
pprint("active: %s" % tpmInfo.active)
if tpmInfo.manufacturer:
pprint("manufacturer: %s" % tpmInfo.manufacturer)
if tpmInfo.model:
pprint("model: %s" % tpmInfo.model)
if tpmInfo.firmware_version:
pprint("firmware_version: %s" % tpmInfo.firmware_version)
print("----------------------------")
eksList = self.ek_svc.list(self.hostId, tpmId)
for ek in eksList:
keyId = ek.key
ekInfo = self.ek_svc.get(self.hostId, tpmId, keyId)
if ekInfo.public_key:
print("----------------------------")
print("TPM Endorsement key")
print("----------------------------")
pprint(ekInfo.public_key)
print("----------------------------")
def main():
tpm_info = TPMInfo()
tpm_info.run()
if __name__ == '__main__':
main()

View File

@ -11,3 +11,17 @@ $ python external_psc_sso_workflow.py --lsurl https://<server>/lookupservice/sdk
``` ```
* Testbed Requirement: * Testbed Requirement:
- 1 vCenter Server - 1 vCenter Server
### Deprecation Notice
Starting vCenter server release 7.0, External Platform Services Controller (PSC) is no longer supported. All PSC services are consolidated into vCenter Server.
https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vcenter.configuration.doc/GUID-135F2607-DA51-47A5-BB7A-56AD141113D4.html
In view of the above, related samples (ex: external_psc_sso_workflow) and other related files are deprecated and will be removed in next major SDK release.
Consequently, lookupservice WSDL files will also be removed in next major SDK release. Use well known URL path (https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-apis-sdks-introduction/GUID-B625C8FE-5E15-4918-98C0-69313E5880FB.html) instead of lookupservice.
For SSO, service endpoint is: "https://{domain}/sts/STSService"
https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-apis-sdks-introduction/GUID-5384662C-CD05-4CAE-894E-972F14A7ECB7.html
### Package Dependency Note
To run the deprecated samples, users need "Deprecated" package installed in their environment.
https://pypi.org/project/Deprecated/

View File

@ -2,7 +2,9 @@
""" """
* ******************************************************* * *******************************************************
* Copyright (c) VMware, Inc. 2017, 2018. All Rights Reserved. * Copyright (c) 2024 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc.
* and/or its subsidiaries.
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* ******************************************************* * *******************************************************
* *
@ -13,11 +15,12 @@
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. * NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
""" """
__author__ = 'VMware, Inc.' __author__ = 'Broadcom, Inc.'
__vcenter_version__ = '6.0+' __vcenter_version__ = '6.0+'
import os import os
import argparse import argparse
from deprecated import deprecated
from six.moves.urllib import request, parse from six.moves.urllib import request, parse
@ -30,6 +33,7 @@ from samples.vsphere.common.ssl_helper import get_unverified_context
from samples.vsphere.common.ssl_helper import get_unverified_session from samples.vsphere.common.ssl_helper import get_unverified_session
@deprecated(version='8.0U3', reason='External PSC is no longer supported since vCenter 7.0. Use well-known endpoint URLs instead of looking them up.')
class ExternalPscSsoWorkflow(object): class ExternalPscSsoWorkflow(object):
""" """
Demonstrates how to Login to vCenter vAPI service with Demonstrates how to Login to vCenter vAPI service with

View File

@ -86,6 +86,15 @@ config["FLOPPY_DATACENTER_NAME"] = config["VM_DATACENTER_NAME"]
config["FLOPPY_DATASTORE_ROOT_PATH"] = config["BACKENDS_DATASTORE_ROOT_PATH"] + "/floppy" config["FLOPPY_DATASTORE_ROOT_PATH"] = config["BACKENDS_DATASTORE_ROOT_PATH"] + "/floppy"
config["FLOPPY_DATASTORE_PATH"] = config["FLOPPY_DATASTORE_ROOT_PATH"] + "/fdboot.img" config["FLOPPY_DATASTORE_PATH"] = config["FLOPPY_DATASTORE_ROOT_PATH"] + "/fdboot.img"
# Snapservice protection group creation spec
config["PG_NAME"] = "PG_NAME"
config["VM_NAMES"] = "VM_NAME1,VM_NAME2,..."
config["VM_FORMATS"] = "VM_FORMAT1,VM_FORMAT2,..."
config["SCHEDULE_UNIT"] = "MINUTE"
config["SCHEDULE"] = 30
config["RETENTION_UNIT"] = "HOUR"
config["RETENTION"] = 6
config["LOCK"] = False
class Testbed(object): class Testbed(object):
def __init__(self): def __init__(self):

View File

@ -0,0 +1,69 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom'
__copyright__ = 'Copyright (c) 2024 Broadcom. All Rights Reserved.'
__vcenter_version__ = '8.0.3+'
from pyVim.connect import SmartConnect
from samples.vsphere.common import sample_cli
from samples.vsphere.common import sample_util
from vmware.vapi.vsphere.client import create_vsphere_client
from samples.vsphere.common.ssl_helper import get_unverified_session
"""
With the single session functionality introduction,
in version 8.0.3, users are enabled to login only once and reuse
the session in vAPI and pyVmomi.
Demonstrates transfer of an authenticated session from pyVmomi
to a vAPI stub. The sample includes post transfer verification
via invocation of `vcenter.compute.Policies.list` operation,
which requires authenticated access.
Sample Prerequisites:
- vCenter
"""
if __name__ == '__main__':
parser = sample_cli.build_arg_parser()
args = sample_util.process_cli_args(parser.parse_args())
# Login with pyvmomi
si = SmartConnect(host=args.server,
user=args.username,
pwd=args.password,
disableSslCertValidation=args.skipverification)
print("Logged in through pyVmomi")
# Acquire session_id
session_id = si._GetStub().GetSessionId()
print("Session ID acquired")
# Reuse session_id in create_vsphere_client
# A login will not be attempted when session_id is provided
session = get_unverified_session() if args.skipverification else None
client = create_vsphere_client(args.server,
session=session,
session_id=session_id)
print("Created vAPI client utilizing the pyVmomi session")
result = client.vcenter.compute.Policies.list()
if type(result) is list:
print("Session has been successfully reused")

View File

@ -0,0 +1,71 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
* SPDX-License-Identifier: MIT
* *******************************************************
*
* DISCLAIMER. THIS PROGRAM IS PROVIDED TO YOU "AS IS" WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN,
* EXPRESS OR IMPLIED. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
* WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY,
* NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
"""
__author__ = 'Broadcom'
__copyright__ = 'Copyright (c) 2024 Broadcom. All Rights Reserved.'
__vcenter_version__ = '8.0.3+'
from pyVim.connect import SmartConnect
from samples.vsphere.common import sample_cli
from samples.vsphere.common import sample_util
from vmware.vapi.vsphere.client import create_vsphere_client
from samples.vsphere.common.ssl_helper import get_unverified_session
"""
With the single session functionality introduction,
in version 8.0.3, users are enabled to login only once and reuse
the session in vAPI and pyVmomi.
Demonstrates transfer of an authenticated session from vAPI to
a pyVmomi stub. The sample includes post transfer verification
via invocation of `sessionManager.SessionIsActive` operation,
which requires authenticated access.
Sample Prerequisites:
- vCenter
"""
if __name__ == '__main__':
parser = sample_cli.build_arg_parser()
args = sample_util.process_cli_args(parser.parse_args())
# Create session through vAPI
session = get_unverified_session() if args.skipverification else None
client = create_vsphere_client(server=args.server,
username=args.username,
password=args.password,
session=session)
print("Logged in through vAPI vSphere client")
# Acquire session_id
session_id = client.get_session_id()
print("Session ID acquired")
# Reuse session_id in SmartConnect
# A login will not be attempted when session_id is provided
si = SmartConnect(host=args.server,
disableSslCertValidation=args.skipverification,
sessionId=session_id)
print("Created pyVmomi stub utilizing the vAPI session")
content = si.RetrieveContent()
reused_session = content.sessionManager.currentSession
result = content.sessionManager.SessionIsActive(reused_session.key, args.username)
if result:
print("Session has been successfully reused")

View File

@ -0,0 +1,26 @@
# vLCM/Cluster/Installed_Images
This directory contains samples of the cluster-level vLCM installed images API
The installed images API provides a way to easily see the software running on hosts in a given cluster. This API will scan the hosts in the target cluster and generate a report detailing what images are being run. These images are organized into three categories: "highest versioned image", "most widely used image", and "hostImageList" which just contains the rest of the images.
## APIs
POST
- The extract POST method triggers the installed images workflow, which is an asynchronous operation. This API returns a task ID which can be used to monitor the progress of the task.
GET
- This GET method is a synchronous operation and it returns the most recently generated installed images report for the cluster corresponding to the provided MoID.
## Running the samples
To view the available command-line options:
```
python samples/vsphere/vcenter/vlcm/cluster/installed_images/installed_images.py -h
```
To run the sample:
```
$ python samples/vsphere/vcenter/vlcm/cluster/installed_images/installed_images.py -v -s <vCenter server IP> -u <username> -p <password> --cluster <cluster MoID>
```

View File

@ -0,0 +1,21 @@
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc.
* and/or its subsidiaries.
* SPDX-License-Identifier: MIT
* *******************************************************
"""
__author__ = 'Broadcom, Inc.'
__copyright__ = 'Copyright 2024 Broadcom, Inc. All rights reserved.'
# Required to distribute different parts of this
# package as multiple distribution
try:
import pkg_resources
pkg_resources.declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__) # @ReservedAssignment

View File

@ -0,0 +1,82 @@
#!/usr/bin/env python
"""
* *******************************************************
* Copyright (c) 2024 Broadcom. All Rights Reserved.
* Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc.
* and/or its subsidiaries.
* SPDX-License-Identifier: MIT
* *******************************************************
"""
__author__ = 'Broadcom, Inc.'
__vcenter_version__ = '8.0.3+'
import time
from com.vmware.esx.settings.clusters_client import InstalledImages
from samples.vsphere.common import sample_cli, sample_util
from samples.vsphere.vcenter.hcl.utils import get_configuration
SUCCEEDED_KEY = "SUCCEEDED"
FAILED_KEY = "FAILED"
# With a 1 second sleep this is equal to roughly 5 minutes
TIME_OUT_ITERATIONS = 300
class InstalledImagesSvc:
"""
Demonstrates triggering the "extract" workflow for the cluster Installed Images
feature, waiting for the task to complete, and getting the result.
Prerequisites:
- A datacenter
- A vSAN cluster with at least one host
"""
def __init__(self):
parser = sample_cli.build_arg_parser()
parser.add_argument("--cluster",
required=True,
help="MoID of the target cluster")
args = sample_util.process_cli_args(parser.parse_args())
self.cluster = args.cluster
config = get_configuration(args.server, args.username,
args.password,
args.skipverification)
self.apiClient = InstalledImages(config)
def run(self):
task = self.apiClient.extract_task(self.cluster)
if self.waitForTask(task):
print("Successfully got installed images report:")
print(self.apiClient.get(self.cluster))
def waitForTask(self, task):
i = 0
try:
while True:
i += 1
status = task.get_info().status
if status == SUCCEEDED_KEY or status == FAILED_KEY:
return True
if i > TIME_OUT_ITERATIONS:
print("Timeout reached waiting for task--cancelling operation")
return False
time.sleep(1)
except Exception as e:
print(f"Error occurred waiting for task: {e}")
return False
def main():
installedImagesSvc = InstalledImagesSvc()
installedImagesSvc.run()
if __name__ == "__main__":
main()

View File

@ -5,23 +5,23 @@ import os
from setuptools import setup from setuptools import setup
setup(name='vsphere-automation-sdk', setup(name='vsphere-automation-sdk',
version='1.86.0', version='1.87.0',
description='VMware vSphere Automation SDK for Python', description='VMware vSphere Automation SDK for Python',
url='https://github.com/vmware/vsphere-automation-sdk-python', url='https://github.com/vmware/vsphere-automation-sdk-python',
author='VMware, Inc.', author='Broadcom, Inc.',
license='MIT', license='MIT',
packages=[], packages=[],
install_requires=[ install_requires=[
'lxml >= 4.3.0', 'lxml >= 4.3.0',
'pyVmomi >=6.7', 'pyVmomi == 8.0.3.0.1',
'vapi-runtime @ file://localhost/{}/lib/vapi-runtime/vapi_runtime-2.44.0-py2.py3-none-any.whl'.format(os.getcwd()), 'vmware-vapi-runtime == 2.52.0',
'vcenter-bindings @ file://localhost/{}/lib/vcenter-bindings/vcenter_bindings-4.2.0-py2.py3-none-any.whl'.format(os.getcwd()), 'vmware-vcenter == 8.0.3.0',
'vapi-common-client @ file://localhost/{}/lib/vapi-common-client/vapi_common_client-2.44.0-py2.py3-none-any.whl'.format(os.getcwd()), 'vmware-vapi-common-client == 2.52.0',
'vmwarecloud-aws @ file://localhost/{}/lib/vmwarecloud-aws/vmwarecloud_aws-1.64.0-py2.py3-none-any.whl'.format(os.getcwd()), 'vmwarecloud-aws @ file://localhost/{}/lib/vmwarecloud-aws/vmwarecloud_aws-1.64.1-py2.py3-none-any.whl'.format(os.getcwd()),
'nsx-python-sdk @ file://localhost/{}/lib/nsx-python-sdk/nsx_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'.format(os.getcwd()), 'nsx-python-sdk @ file://localhost/{}/lib/nsx-python-sdk/nsx_python_sdk-4.2.0-py2.py3-none-any.whl'.format(os.getcwd()),
'nsx-policy-python-sdk @ file://localhost/{}/lib/nsx-policy-python-sdk/nsx_policy_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'.format(os.getcwd()), 'nsx-policy-python-sdk @ file://localhost/{}/lib/nsx-policy-python-sdk/nsx_policy_python_sdk-4.2.0-py2.py3-none-any.whl'.format(os.getcwd()),
'nsx-vmc-policy-python-sdk @ file://localhost/{}/lib/nsx-vmc-policy-python-sdk/nsx_vmc_policy_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'.format(os.getcwd()), 'nsx-vmc-policy-python-sdk @ file://localhost/{}/lib/nsx-vmc-policy-python-sdk/nsx_vmc_policy_python_sdk-4.1.2.0.1-py2.py3-none-any.whl'.format(os.getcwd()),
'nsx-vmc-aws-integration-python-sdk @ file://localhost/{}/lib/nsx-vmc-aws-integration-python-sdk/nsx_vmc_aws_integration_python_sdk-4.1.2.0.0-py2.py3-none-any.whl'.format(os.getcwd()), 'nsx-vmc-aws-integration-python-sdk @ file://localhost/{}/lib/nsx-vmc-aws-integration-python-sdk/nsx_vmc_aws_integration_python_sdk-4.1.2.0.1-py2.py3-none-any.whl'.format(os.getcwd()),
'vmwarecloud-draas @ file://localhost/{}/lib/vmwarecloud-draas/vmwarecloud_draas-1.23.0-py2.py3-none-any.whl'.format(os.getcwd()), 'vmwarecloud-draas @ file://localhost/{}/lib/vmwarecloud-draas/vmwarecloud_draas-1.23.1-py2.py3-none-any.whl'.format(os.getcwd()),
] ]
) )