vmware-nsx/devstack/tools/nsxv_edge_resources.py
Gary Kotton ae8184fa15 NSX|V: add in edge resource configuration support
Version 6.2.3 enables on to configure edge resources. This patch
ensures that no reservations will take place. This will also
enable us in the future to expose this feature.

The patch also adds in a utility that can be run out of band. This
can be done if the NSX is upgraded to 6.2.3 and the plugin will
not need to be restarted.

Change-Id: I19a8e7371047f1e274dddf8d734b126289167fad
2016-07-11 07:45:27 -07:00

111 lines
3.8 KiB
Python

#!/usr/bin/env python
# Copyright 2015 VMware Inc
# All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Purpose: Configure edge resource limits
Usage:
python nsxv_edge_resources.py --vsm-ip <nsx-manager-ip>
--username <nsx-manager-username>
--password <nsx-manager-password>
"""
import base64
import optparse
from oslo_serialization import jsonutils
import requests
import six
import xml.etree.ElementTree as et
requests.packages.urllib3.disable_warnings()
class NSXClient(object):
def __init__(self, host, username, password, *args, **kwargs):
self._host = host
self._username = username
self._password = password
def _get_headers(self, format):
auth_cred = self._username + ":" + self._password
auth = base64.b64encode(auth_cred)
headers = {}
headers['Authorization'] = "Basic %s" % auth
headers['Content-Type'] = "application/%s" % format
headers['Accept'] = "application/%s" % format
return headers
def _get_url(self, uri):
return 'https://%s/%s' % (self._host, uri)
def _get(self, format, uri):
headers = self._get_headers(format)
url = self._get_url(uri)
response = requests.get(url, headers=headers,
verify=False)
return response
def _put(self, format, uri, data):
headers = self._get_headers(format)
url = self._get_url(uri)
response = requests.put(url, headers=headers,
verify=False, data=data)
return response
def _get_tuning_configration(self):
response = self._get("json",
"/api/4.0/edgePublish/tuningConfiguration")
return jsonutils.loads(response.text)
def configure_reservations(self):
config = self._get_tuning_configration()
# NSX only receive XML format for the resource allocation update
tuning = et.Element('tuningConfiguration')
for opt, val in six.iteritems(config):
child = et.Element(opt)
if (opt == 'edgeVCpuReservationPercentage' or
opt == 'edgeMemoryReservationPercentage'):
child.text = '0'
elif opt == 'megaHertzPerVCpu':
child.text = '1500'
else:
child.text = str(val)
tuning.append(child)
self._put("xml",
"/api/4.0/edgePublish/tuningConfiguration",
et.tostring(tuning))
print ("Edge resource limits set")
if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("--vsm-ip", dest="vsm_ip", help="NSX Manager IP address")
parser.add_option("-u", "--username", default="admin", dest="username",
help="NSX Manager username")
parser.add_option("-p", "--password", default="default", dest="password",
help="NSX Manager password")
(options, args) = parser.parse_args()
print ("vsm-ip: %s" % options.vsm_ip)
print ("username: %s" % options.username)
print ("password: %s" % options.password)
nsx_client = NSXClient(options.vsm_ip, options.username,
options.password)
nsx_client.configure_reservations()