diff --git a/confluent_client/bin/nodestorage b/confluent_client/bin/nodestorage new file mode 100644 index 00000000..8ad2020c --- /dev/null +++ b/confluent_client/bin/nodestorage @@ -0,0 +1,123 @@ +#!/usr/bin/python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2018 Lenovo +# +# 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. + +import optparse +import os +import signal +import sys + +try: + signal.signal(signal.SIGPIPE, signal.SIG_DFL) +except AttributeError: + pass +path = os.path.dirname(os.path.realpath(__file__)) +path = os.path.realpath(os.path.join(path, '..', 'lib', 'python')) +if path.startswith('/opt'): + sys.path.append(path) + +import confluent.client as client +exitcode = 0 + +class OptParser(optparse.OptionParser): + + def format_epilog(self, formatter): + return self.expand_prog_name(self.epilog) + + +def showstorage(noderange, options, args): + global exitcode + session = client.Command() + storagebynode = {} + disks = {} + arrays = {} + volumes = {} + scfg = session.read('/noderange/{0}/configuration/storage/all'.format( + noderange)) + for e in scfg: + if 'error' in e: + sys.stderr.write(e['error'] + '\n') + exitcode = e.get('errorcode', 1) + for node in e.get('databynode', {}): + if node not in storagebynode: + storagebynode[node] = {'disks': [], 'arrays': [], 'volumes': []} + curr = e['databynode'][node] + storagebynode[node][curr['type'] + 's'].append(curr) + for node in storagebynode: + for disk in storagebynode[node]['disks']: + print(repr(disk)) + + +def createstorage(noderange, options, args): + session = client.Command() + +def deletestorage(noderange, options, args): + pass + +def setstorage(noderange, options, args): + pass + +funmap = { + 'create': createstorage, + 'show': showstorage, + 'set': setstorage, + 'delete': deletestorage, + 'rm': deletestorage, +} + + + +def main(): + argparser = OptParser( + usage='Usage: %prog [show|create|set|delete]', + epilog='', + ) + argparser.add_option('-r', '--raidlevel', type='int', + help='RAID level to use when creating an array') + argparser.add_option('-d', '--disks', type='str', + help='Comma separated list of disks to use, or the ' + 'word "rest" to indicate use of all available ' + 'disks') + argparser.add_option('-s', '--size', type='str', + help='Comma separated list of sizes to use when ' + 'creating volumes. The sizes may be absolute ' + 'size (e.g. 16gb), percentage (10%) or the word ' + '"rest" to use remaining capacity, default ' + 'behavior is to use all capacity to make a ' + 'volume') + argparser.add_option('-n', '--name', type='str', + help='Comma separated list of names to use when ' + 'naming volumes, or selecting a volume for ' + 'delete. Default behavior is to use ' + 'implementation provided default names.') + (options, args) = argparser.parse_args() + try: + noderange = args[0] + operation = args[1] + except IndexError: + argparser.print_help() + sys.exit(1) + client.check_globbing(noderange) + try: + handler = funmap[operation] + except KeyError: + argparser.print_help() + sys.exit(1) + handler(noderange, options, args) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/confluent_server/confluent/messages.py b/confluent_server/confluent/messages.py index 68b8839c..881127b5 100644 --- a/confluent_server/confluent/messages.py +++ b/confluent_server/confluent/messages.py @@ -32,6 +32,11 @@ valid_health_values = set([ 'unknown', ]) +def simplify_name(name): + return name.lower().replace(' ', '_').replace('/', '-').replace( + '_-_', '-') + + def _htmlify_structure(indict): ret = "