Beispiel #1
0
def _parse_set_weight_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    try:
        devs = []
        if not new_cmd_format:
            if len(args) % 2 != 0:
                print(Commands.set_weight.__doc__.strip())
                exit(EXIT_ERROR)

            devs_and_weights = izip(islice(argvish, 0, len(argvish), 2),
                                    islice(argvish, 1, len(argvish), 2))
            for devstr, weightstr in devs_and_weights:
                devs.extend(builder.search_devs(
                    parse_search_value(devstr)) or [])
                weight = float(weightstr)
                _set_weight_values(devs, weight)
        else:
            if len(args) != 1:
                print(Commands.set_weight.__doc__.strip())
                exit(EXIT_ERROR)

            devs.extend(builder.search_devs(
                parse_search_values_from_opts(opts)) or [])
            weight = float(args[0])
            _set_weight_values(devs, weight)
    except ValueError as e:
        print(e)
        exit(EXIT_ERROR)
Beispiel #2
0
 def test_validate_args(self):
     argv = \
         ["--id", "1", "--region", "2", "--zone", "3",
          "--ip", "test.test.com",
          "--port", "6200",
          "--replication-ip", "r.test.com",
          "--replication-port", "7000",
          "--device", "sda3",
          "--meta", "some meta data",
          "--weight", "3.14159265359",
          "--change-ip", "change.test.test.com",
          "--change-port", "6201",
          "--change-replication-ip", "change.r.test.com",
          "--change-replication-port", "7001",
          "--change-device", "sdb3",
          "--change-meta", "some meta data for change"]
     new_cmd_format, opts, args = validate_args(argv)
     self.assertTrue(new_cmd_format)
     self.assertEqual(opts.id, 1)
     self.assertEqual(opts.region, 2)
     self.assertEqual(opts.zone, 3)
     self.assertEqual(opts.ip, "test.test.com")
     self.assertEqual(opts.port, 6200)
     self.assertEqual(opts.replication_ip, "r.test.com")
     self.assertEqual(opts.replication_port, 7000)
     self.assertEqual(opts.device, "sda3")
     self.assertEqual(opts.meta, "some meta data")
     self.assertEqual(opts.weight, 3.14159265359)
     self.assertEqual(opts.change_ip, "change.test.test.com")
     self.assertEqual(opts.change_port, 6201)
     self.assertEqual(opts.change_replication_ip, "change.r.test.com")
     self.assertEqual(opts.change_replication_port, 7001)
     self.assertEqual(opts.change_device, "sdb3")
     self.assertEqual(opts.change_meta, "some meta data for change")
Beispiel #3
0
def _parse_remove_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    try:
        devs = []
        if len(args) > 0:
            if new_cmd_format:
                print(Commands.remove.__doc__.strip())
                exit(EXIT_ERROR)

            for arg in args:
                devs.extend(builder.search_devs(
                    parse_search_value(arg)) or [])
        else:
            devs.extend(builder.search_devs(
                parse_search_values_from_opts(opts)))

        return devs
    except ValueError as e:
        print(e)
        exit(EXIT_ERROR)
Beispiel #4
0
def _parse_remove_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    try:
        devs = []
        if len(args) > 0:
            if new_cmd_format:
                print Commands.remove.__doc__.strip()
                exit(EXIT_ERROR)

            for arg in args:
                devs.extend(builder.search_devs(
                    parse_search_value(arg)) or [])
        else:
            devs.extend(builder.search_devs(
                parse_search_values_from_opts(opts)))

        return devs
    except ValueError as e:
        print e
        exit(EXIT_ERROR)
Beispiel #5
0
 def test_validate_args(self):
     argv = \
         ["--id", "1", "--region", "2", "--zone", "3",
          "--ip", "test.test.com",
          "--port", "6200",
          "--replication-ip", "r.test.com",
          "--replication-port", "7000",
          "--device", "sda3",
          "--meta", "some meta data",
          "--weight", "3.14159265359",
          "--change-ip", "change.test.test.com",
          "--change-port", "6201",
          "--change-replication-ip", "change.r.test.com",
          "--change-replication-port", "7001",
          "--change-device", "sdb3",
          "--change-meta", "some meta data for change"]
     new_cmd_format, opts, args = validate_args(argv)
     self.assertTrue(new_cmd_format)
     self.assertEqual(opts.id, 1)
     self.assertEqual(opts.region, 2)
     self.assertEqual(opts.zone, 3)
     self.assertEqual(opts.ip, "test.test.com")
     self.assertEqual(opts.port, 6200)
     self.assertEqual(opts.replication_ip, "r.test.com")
     self.assertEqual(opts.replication_port, 7000)
     self.assertEqual(opts.device, "sda3")
     self.assertEqual(opts.meta, "some meta data")
     self.assertEqual(opts.weight, 3.14159265359)
     self.assertEqual(opts.change_ip, "change.test.test.com")
     self.assertEqual(opts.change_port, 6201)
     self.assertEqual(opts.change_replication_ip, "change.r.test.com")
     self.assertEqual(opts.change_replication_port, 7001)
     self.assertEqual(opts.change_device, "sdb3")
     self.assertEqual(opts.change_meta, "some meta data for change")
Beispiel #6
0
def _parse_set_weight_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    try:
        devs = []
        if not new_cmd_format:
            if len(args) % 2 != 0:
                print(Commands.set_weight.__doc__.strip())
                exit(EXIT_ERROR)

            devs_and_weights = izip(islice(argvish, 0, len(argvish), 2),
                                    islice(argvish, 1, len(argvish), 2))
            for devstr, weightstr in devs_and_weights:
                devs.extend(
                    builder.search_devs(parse_search_value(devstr)) or [])
                weight = float(weightstr)
                _set_weight_values(devs, weight)
        else:
            if len(args) != 1:
                print(Commands.set_weight.__doc__.strip())
                exit(EXIT_ERROR)

            devs.extend(
                builder.search_devs(parse_search_values_from_opts(opts)) or [])
            weight = float(args[0])
            _set_weight_values(devs, weight)
    except ValueError as e:
        print(e)
        exit(EXIT_ERROR)
Beispiel #7
0
def _parse_add_values(argvish):
    """
    Parse devices to add as specified on the command line.

    Will exit on error and spew warnings.

    :returns: array of device dicts
    """
    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    parsed_devs = []
    if len(args) > 0:
        if new_cmd_format or len(args) % 2 != 0:
            print(Commands.add.__doc__.strip())
            exit(EXIT_ERROR)

        devs_and_weights = izip(islice(args, 0, len(args), 2),
                                islice(args, 1, len(args), 2))

        for devstr, weightstr in devs_and_weights:
            dev_dict = parse_add_value(devstr)

            if dev_dict['region'] is None:
                stderr.write('WARNING: No region specified for %s. '
                             'Defaulting to region 1.\n' % devstr)
                dev_dict['region'] = 1

            if dev_dict['replication_ip'] is None:
                dev_dict['replication_ip'] = dev_dict['ip']

            if dev_dict['replication_port'] is None:
                dev_dict['replication_port'] = dev_dict['port']

            weight = float(weightstr)
            if weight < 0:
                raise ValueError('Invalid weight value: %s' % devstr)
            dev_dict['weight'] = weight

            parsed_devs.append(dev_dict)
    else:
        parsed_devs.append(build_dev_from_opts(opts))

    return parsed_devs
Beispiel #8
0
def _parse_add_values(argvish):
    """
    Parse devices to add as specified on the command line.

    Will exit on error and spew warnings.

    :returns: array of device dicts
    """
    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    parsed_devs = []
    if len(args) > 0:
        if new_cmd_format or len(args) % 2 != 0:
            print(Commands.add.__doc__.strip())
            exit(EXIT_ERROR)

        devs_and_weights = izip(islice(args, 0, len(args), 2),
                                islice(args, 1, len(args), 2))

        for devstr, weightstr in devs_and_weights:
            dev_dict = parse_add_value(devstr)

            if dev_dict['region'] is None:
                stderr.write('WARNING: No region specified for %s. '
                             'Defaulting to region 1.\n' % devstr)
                dev_dict['region'] = 1

            if dev_dict['replication_ip'] is None:
                dev_dict['replication_ip'] = dev_dict['ip']

            if dev_dict['replication_port'] is None:
                dev_dict['replication_port'] = dev_dict['port']

            weight = float(weightstr)
            if weight < 0:
                raise ValueError('Invalid weight value: %s' % devstr)
            dev_dict['weight'] = weight

            parsed_devs.append(dev_dict)
    else:
        parsed_devs.append(build_dev_from_opts(opts))

    return parsed_devs
Beispiel #9
0
    def test_validate_args_new_cmd_format(self):
        argv = \
            ["--id", "0", "--region", "0", "--zone", "0",
             "--ip", "",
             "--port", "0",
             "--replication-ip", "",
             "--replication-port", "0",
             "--device", "",
             "--meta", "",
             "--weight", "0",
             "--change-ip", "",
             "--change-port", "0",
             "--change-replication-ip", "",
             "--change-replication-port", "0",
             "--change-device", "",
             "--change-meta", ""]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)

        argv = \
            ["--id", None, "--region", None, "--zone", None,
             "--ip", "",
             "--port", "0",
             "--replication-ip", "",
             "--replication-port", "0",
             "--device", "",
             "--meta", "",
             "--weight", None,
             "--change-ip", "change.test.test.com",
             "--change-port", "6201",
             "--change-replication-ip", "change.r.test.com",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertFalse(new_cmd_format)

        argv = \
            ["--id", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
        argv = \
            ["--region", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
        argv = \
            ["--zone", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
        argv = \
            ["--weight", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
Beispiel #10
0
    def test_validate_args_new_cmd_format(self):
        argv = \
            ["--id", "0", "--region", "0", "--zone", "0",
             "--ip", "",
             "--port", "0",
             "--replication-ip", "",
             "--replication-port", "0",
             "--device", "",
             "--meta", "",
             "--weight", "0",
             "--change-ip", "",
             "--change-port", "0",
             "--change-replication-ip", "",
             "--change-replication-port", "0",
             "--change-device", "",
             "--change-meta", ""]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)

        argv = \
            ["--id", None, "--region", None, "--zone", None,
             "--ip", "",
             "--port", "0",
             "--replication-ip", "",
             "--replication-port", "0",
             "--device", "",
             "--meta", "",
             "--weight", None,
             "--change-ip", "change.test.test.com",
             "--change-port", "6201",
             "--change-replication-ip", "change.r.test.com",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertFalse(new_cmd_format)

        argv = \
            ["--id", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
        argv = \
            ["--region", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
        argv = \
            ["--zone", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
        argv = \
            ["--weight", "0"]
        new_cmd_format, opts, args = validate_args(argv)
        self.assertTrue(new_cmd_format)
Beispiel #11
0
def _parse_set_info_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    if not new_cmd_format:
        if len(args) % 2 != 0:
            print(Commands.search.__doc__.strip())
            exit(EXIT_ERROR)

        searches_and_changes = izip(islice(argvish, 0, len(argvish), 2),
                                    islice(argvish, 1, len(argvish), 2))

        for search_value, change_value in searches_and_changes:
            devs = builder.search_devs(parse_search_value(search_value))
            change = {}

            change_value = calculate_change_value(change_value, change,
                                                  'ip', 'port')

            if change_value.startswith('R'):
                change_value = change_value[1:]
                change_value = calculate_change_value(change_value, change,
                                                      'replication_ip',
                                                      'replication_port')
            if change_value.startswith('/'):
                i = 1
                while i < len(change_value) and change_value[i] != '_':
                    i += 1
                change['device'] = change_value[1:i]
                change_value = change_value[i:]
            if change_value.startswith('_'):
                change['meta'] = change_value[1:]
                change_value = ''
            if change_value or not change:
                raise ValueError('Invalid set info change value: %s' %
                                 repr(argvish[1]))
            _set_info_values(devs, change, opts)
    else:
        devs = builder.search_devs(parse_search_values_from_opts(opts))
        change = parse_change_values_from_opts(opts)
        _set_info_values(devs, change, opts)
Beispiel #12
0
def _parse_set_info_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    if not new_cmd_format:
        if len(args) % 2 != 0:
            print(Commands.search.__doc__.strip())
            exit(EXIT_ERROR)

        searches_and_changes = izip(islice(argvish, 0, len(argvish), 2),
                                    islice(argvish, 1, len(argvish), 2))

        for search_value, change_value in searches_and_changes:
            devs = builder.search_devs(parse_search_value(search_value))
            change = {}

            change_value = calculate_change_value(change_value, change,
                                                  'ip', 'port')

            if change_value.startswith('R'):
                change_value = change_value[1:]
                change_value = calculate_change_value(change_value, change,
                                                      'replication_ip',
                                                      'replication_port')
            if change_value.startswith('/'):
                i = 1
                while i < len(change_value) and change_value[i] != '_':
                    i += 1
                change['device'] = change_value[1:i]
                change_value = change_value[i:]
            if change_value.startswith('_'):
                change['meta'] = change_value[1:]
                change_value = ''
            if change_value or not change:
                raise ValueError('Invalid set info change value: %s' %
                                 repr(argvish[1]))
            _set_info_values(devs, change, opts)
    else:
        devs = builder.search_devs(parse_search_values_from_opts(opts))
        change = parse_change_values_from_opts(opts)
        _set_info_values(devs, change, opts)
Beispiel #13
0
def _parse_search_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    try:
        search_values = {}
        if len(args) > 0:
            if new_cmd_format or len(args) != 1:
                print(Commands.search.__doc__.strip())
                exit(EXIT_ERROR)
            search_values = parse_search_value(args[0])
        else:
            search_values = parse_search_values_from_opts(opts)
        return search_values
    except ValueError as e:
        print(e)
        exit(EXIT_ERROR)
Beispiel #14
0
def _parse_search_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    try:
        search_values = {}
        if len(args) > 0:
            if new_cmd_format or len(args) != 1:
                print(Commands.search.__doc__.strip())
                exit(EXIT_ERROR)
            search_values = parse_search_value(args[0])
        else:
            search_values = parse_search_values_from_opts(opts)
        return search_values
    except ValueError as e:
        print(e)
        exit(EXIT_ERROR)
Beispiel #15
0
def _parse_set_info_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    if not new_cmd_format:
        if len(args) % 2 != 0:
            print(Commands.search.__doc__.strip())
            exit(EXIT_ERROR)

        searches_and_changes = izip(islice(argvish, 0, len(argvish), 2), islice(argvish, 1, len(argvish), 2))

        for search_value, change_value in searches_and_changes:
            devs = builder.search_devs(parse_search_value(search_value))
            change = {}
            ip = ""
            if len(change_value) and change_value[0].isdigit():
                i = 1
                while i < len(change_value) and change_value[i] in "0123456789.":
                    i += 1
                ip = change_value[:i]
                change_value = change_value[i:]
            elif len(change_value) and change_value[0] == "[":
                i = 1
                while i < len(change_value) and change_value[i] != "]":
                    i += 1
                i += 1
                ip = change_value[:i].lstrip("[").rstrip("]")
                change_value = change_value[i:]
            if ip:
                change["ip"] = validate_and_normalize_ip(ip)
            if change_value.startswith(":"):
                i = 1
                while i < len(change_value) and change_value[i].isdigit():
                    i += 1
                change["port"] = int(change_value[1:i])
                change_value = change_value[i:]
            if change_value.startswith("R"):
                change_value = change_value[1:]
                replication_ip = ""
                if len(change_value) and change_value[0].isdigit():
                    i = 1
                    while i < len(change_value) and change_value[i] in "0123456789.":
                        i += 1
                    replication_ip = change_value[:i]
                    change_value = change_value[i:]
                elif len(change_value) and change_value[0] == "[":
                    i = 1
                    while i < len(change_value) and change_value[i] != "]":
                        i += 1
                    i += 1
                    replication_ip = change_value[:i].lstrip("[").rstrip("]")
                    change_value = change_value[i:]
                if replication_ip:
                    change["replication_ip"] = validate_and_normalize_ip(replication_ip)
                if change_value.startswith(":"):
                    i = 1
                    while i < len(change_value) and change_value[i].isdigit():
                        i += 1
                    change["replication_port"] = int(change_value[1:i])
                    change_value = change_value[i:]
            if change_value.startswith("/"):
                i = 1
                while i < len(change_value) and change_value[i] != "_":
                    i += 1
                change["device"] = change_value[1:i]
                change_value = change_value[i:]
            if change_value.startswith("_"):
                change["meta"] = change_value[1:]
                change_value = ""
            if change_value or not change:
                raise ValueError("Invalid set info change value: %s" % repr(argvish[1]))
            _set_info_values(devs, change)
    else:
        devs = builder.search_devs(parse_search_values_from_opts(opts))
        change = parse_change_values_from_opts(opts)
        _set_info_values(devs, change)
Beispiel #16
0
    def test_parse_change_values_from_opts(self):
        argv = \
            ["--id", "1", "--region", "2", "--zone", "3",
             "--ip", "test.test.com",
             "--port", "6200",
             "--replication-ip", "r.test.com",
             "--replication-port", "7000",
             "--device", "sda3",
             "--meta", "some meta data",
             "--weight", "3.14159265359",
             "--change-ip", "change.test.test.com",
             "--change-port", "6201",
             "--change-replication-ip", "change.r.test.com",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        expected = {
            'ip': "change.test.test.com",
            'port': 6201,
            'replication_ip': "change.r.test.com",
            'replication_port': 7001,
            'device': "sdb3",
            'meta': "some meta data for change",
        }
        new_cmd_format, opts, args = validate_args(argv)
        search_values = parse_change_values_from_opts(opts)
        self.assertEqual(search_values, expected)

        argv = \
            ["--id", "1", "--region", "2", "--zone", "3",
             "--ip", "127.0.0.1",
             "--port", "6200",
             "--replication-ip", "127.0.0.10",
             "--replication-port", "7000",
             "--device", "sda3",
             "--meta", "some meta data",
             "--weight", "3.14159265359",
             "--change-ip", "127.0.0.2",
             "--change-port", "6201",
             "--change-replication-ip", "127.0.0.20",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        expected = {
            'ip': "127.0.0.2",
            'port': 6201,
            'replication_ip': "127.0.0.20",
            'replication_port': 7001,
            'device': "sdb3",
            'meta': "some meta data for change",
        }
        new_cmd_format, opts, args = validate_args(argv)
        search_values = parse_change_values_from_opts(opts)
        self.assertEqual(search_values, expected)

        argv = \
            ["--id", "1", "--region", "2", "--zone", "3",
             "--ip", "[127.0.0.1]",
             "--port", "6200",
             "--replication-ip", "[127.0.0.10]",
             "--replication-port", "7000",
             "--device", "sda3",
             "--meta", "some meta data",
             "--weight", "3.14159265359",
             "--change-ip", "[127.0.0.2]",
             "--change-port", "6201",
             "--change-replication-ip", "[127.0.0.20]",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        new_cmd_format, opts, args = validate_args(argv)
        search_values = parse_change_values_from_opts(opts)
        self.assertEqual(search_values, expected)
Beispiel #17
0
def _parse_add_values(argvish):
    """
    Parse devices to add as specified on the command line.

    Will exit on error and spew warnings.

    :returns: array of device dicts
    """
    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    parsed_devs = []
    if len(args) > 0:
        if new_cmd_format or len(args) % 2 != 0:
            print Commands.add.__doc__.strip()
            exit(EXIT_ERROR)

        devs_and_weights = izip(islice(args, 0, len(args), 2),
                                islice(args, 1, len(args), 2))

        for devstr, weightstr in devs_and_weights:
            region = 1
            rest = devstr
            if devstr.startswith('r'):
                i = 1
                while i < len(devstr) and devstr[i].isdigit():
                    i += 1
                region = int(devstr[1:i])
                rest = devstr[i:]
            else:
                stderr.write('WARNING: No region specified for %s. '
                             'Defaulting to region 1.\n' % devstr)

            if not rest.startswith('z'):
                raise ValueError('Invalid add value: %s' % devstr)
            i = 1
            while i < len(rest) and rest[i].isdigit():
                i += 1
            zone = int(rest[1:i])
            rest = rest[i:]

            if not rest.startswith('-'):
                raise ValueError('Invalid add value: %s' % devstr)

            ip, port, rest = _parse_address(rest[1:])

            replication_ip = ip
            replication_port = port
            if rest.startswith('R'):
                replication_ip, replication_port, rest =  \
                    _parse_address(rest[1:])
            if not rest.startswith('/'):
                raise ValueError('Invalid add value: %s' % devstr)
            i = 1
            while i < len(rest) and rest[i] != '_':
                i += 1
            device_name = rest[1:i]
            if not validate_device_name(device_name):
                raise ValueError('Invalid device name')

            rest = rest[i:]

            meta = ''
            if rest.startswith('_'):
                meta = rest[1:]

            weight = float(weightstr)

            if weight < 0:
                raise ValueError('Invalid weight value: %s' % devstr)

            parsed_devs.append({
                'region': region,
                'zone': zone,
                'ip': ip,
                'port': port,
                'device': device_name,
                'replication_ip': replication_ip,
                'replication_port': replication_port,
                'weight': weight,
                'meta': meta
            })
    else:
        parsed_devs.append(build_dev_from_opts(opts))

    return parsed_devs
Beispiel #18
0
def _parse_set_info_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    if not new_cmd_format:
        if len(args) % 2 != 0:
            print(Commands.search.__doc__.strip())
            exit(EXIT_ERROR)

        searches_and_changes = izip(islice(argvish, 0, len(argvish), 2),
                                    islice(argvish, 1, len(argvish), 2))

        for search_value, change_value in searches_and_changes:
            devs = builder.search_devs(parse_search_value(search_value))
            change = {}
            ip = ''
            if change_value and change_value[0].isdigit():
                i = 1
                while (i < len(change_value) and
                       change_value[i] in '0123456789.'):
                    i += 1
                ip = change_value[:i]
                change_value = change_value[i:]
            elif change_value and change_value.startswith('['):
                i = 1
                while i < len(change_value) and change_value[i] != ']':
                    i += 1
                i += 1
                ip = change_value[:i].lstrip('[').rstrip(']')
                change_value = change_value[i:]
            if ip:
                change['ip'] = validate_and_normalize_ip(ip)
            if change_value.startswith(':'):
                i = 1
                while i < len(change_value) and change_value[i].isdigit():
                    i += 1
                change['port'] = int(change_value[1:i])
                change_value = change_value[i:]
            if change_value.startswith('R'):
                change_value = change_value[1:]
                replication_ip = ''
                if change_value and change_value[0].isdigit():
                    i = 1
                    while (i < len(change_value) and
                           change_value[i] in '0123456789.'):
                        i += 1
                    replication_ip = change_value[:i]
                    change_value = change_value[i:]
                elif change_value and change_value.startswith('['):
                    i = 1
                    while i < len(change_value) and change_value[i] != ']':
                        i += 1
                    i += 1
                    replication_ip = \
                        change_value[:i].lstrip('[').rstrip(']')
                    change_value = change_value[i:]
                if replication_ip:
                    change['replication_ip'] = \
                        validate_and_normalize_ip(replication_ip)
                if change_value.startswith(':'):
                    i = 1
                    while i < len(change_value) and change_value[i].isdigit():
                        i += 1
                    change['replication_port'] = int(change_value[1:i])
                    change_value = change_value[i:]
            if change_value.startswith('/'):
                i = 1
                while i < len(change_value) and change_value[i] != '_':
                    i += 1
                change['device'] = change_value[1:i]
                change_value = change_value[i:]
            if change_value.startswith('_'):
                change['meta'] = change_value[1:]
                change_value = ''
            if change_value or not change:
                raise ValueError('Invalid set info change value: %s' %
                                 repr(argvish[1]))
            _set_info_values(devs, change)
    else:
        devs = builder.search_devs(parse_search_values_from_opts(opts))
        change = parse_change_values_from_opts(opts)
        _set_info_values(devs, change)
Beispiel #19
0
def _parse_add_values(argvish):
    """
    Parse devices to add as specified on the command line.

    Will exit on error and spew warnings.

    :returns: array of device dicts
    """
    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    parsed_devs = []
    if len(args) > 0:
        if new_cmd_format or len(args) % 2 != 0:
            print Commands.add.__doc__.strip()
            exit(EXIT_ERROR)

        devs_and_weights = izip(islice(args, 0, len(args), 2),
                                islice(args, 1, len(args), 2))

        for devstr, weightstr in devs_and_weights:
            region = 1
            rest = devstr
            if devstr.startswith('r'):
                i = 1
                while i < len(devstr) and devstr[i].isdigit():
                    i += 1
                region = int(devstr[1:i])
                rest = devstr[i:]
            else:
                stderr.write('WARNING: No region specified for %s. '
                             'Defaulting to region 1.\n' % devstr)

            if not rest.startswith('z'):
                raise ValueError('Invalid add value: %s' % devstr)
            i = 1
            while i < len(rest) and rest[i].isdigit():
                i += 1
            zone = int(rest[1:i])
            rest = rest[i:]

            if not rest.startswith('-'):
                raise ValueError('Invalid add value: %s' % devstr)

            ip, port, rest = _parse_address(rest[1:])

            replication_ip = ip
            replication_port = port
            if rest.startswith('R'):
                replication_ip, replication_port, rest =  \
                    _parse_address(rest[1:])
            if not rest.startswith('/'):
                raise ValueError(
                    'Invalid add value: %s' % devstr)
            i = 1
            while i < len(rest) and rest[i] != '_':
                i += 1
            device_name = rest[1:i]
            rest = rest[i:]

            meta = ''
            if rest.startswith('_'):
                meta = rest[1:]

            weight = float(weightstr)

            if weight < 0:
                raise ValueError('Invalid weight value: %s' % devstr)

            parsed_devs.append({'region': region, 'zone': zone, 'ip': ip,
                                'port': port, 'device': device_name,
                                'replication_ip': replication_ip,
                                'replication_port': replication_port,
                                'weight': weight, 'meta': meta})
    else:
        parsed_devs.append(build_dev_from_opts(opts))

    return parsed_devs
Beispiel #20
0
    def test_parse_change_values_from_opts(self):
        argv = \
            ["--id", "1", "--region", "2", "--zone", "3",
             "--ip", "test.test.com",
             "--port", "6000",
             "--replication-ip", "r.test.com",
             "--replication-port", "7000",
             "--device", "sda3",
             "--meta", "some meta data",
             "--weight", "3.14159265359",
             "--change-ip", "change.test.test.com",
             "--change-port", "6001",
             "--change-replication-ip", "change.r.test.com",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        expected = {
            'ip': "change.test.test.com",
            'port': 6001,
            'replication_ip': "change.r.test.com",
            'replication_port': 7001,
            'device': "sdb3",
            'meta': "some meta data for change",
        }
        new_cmd_format, opts, args = validate_args(argv)
        search_values = parse_change_values_from_opts(opts)
        self.assertEquals(search_values, expected)

        argv = \
            ["--id", "1", "--region", "2", "--zone", "3",
             "--ip", "127.0.0.1",
             "--port", "6000",
             "--replication-ip", "127.0.0.10",
             "--replication-port", "7000",
             "--device", "sda3",
             "--meta", "some meta data",
             "--weight", "3.14159265359",
             "--change-ip", "127.0.0.2",
             "--change-port", "6001",
             "--change-replication-ip", "127.0.0.20",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        expected = {
            'ip': "127.0.0.2",
            'port': 6001,
            'replication_ip': "127.0.0.20",
            'replication_port': 7001,
            'device': "sdb3",
            'meta': "some meta data for change",
        }
        new_cmd_format, opts, args = validate_args(argv)
        search_values = parse_change_values_from_opts(opts)
        self.assertEquals(search_values, expected)

        argv = \
            ["--id", "1", "--region", "2", "--zone", "3",
             "--ip", "[127.0.0.1]",
             "--port", "6000",
             "--replication-ip", "[127.0.0.10]",
             "--replication-port", "7000",
             "--device", "sda3",
             "--meta", "some meta data",
             "--weight", "3.14159265359",
             "--change-ip", "[127.0.0.2]",
             "--change-port", "6001",
             "--change-replication-ip", "[127.0.0.20]",
             "--change-replication-port", "7001",
             "--change-device", "sdb3",
             "--change-meta", "some meta data for change"]
        new_cmd_format, opts, args = validate_args(argv)
        search_values = parse_change_values_from_opts(opts)
        self.assertEquals(search_values, expected)
Beispiel #21
0
def _parse_set_info_values(argvish):

    new_cmd_format, opts, args = validate_args(argvish)

    # We'll either parse the all-in-one-string format or the
    # --options format,
    # but not both. If both are specified, raise an error.
    if not new_cmd_format:
        if len(args) % 2 != 0:
            print(Commands.search.__doc__.strip())
            exit(EXIT_ERROR)

        searches_and_changes = izip(islice(argvish, 0, len(argvish), 2),
                                    islice(argvish, 1, len(argvish), 2))

        for search_value, change_value in searches_and_changes:
            devs = builder.search_devs(parse_search_value(search_value))
            change = {}
            ip = ''
            if len(change_value) and change_value[0].isdigit():
                i = 1
                while (i < len(change_value)
                       and change_value[i] in '0123456789.'):
                    i += 1
                ip = change_value[:i]
                change_value = change_value[i:]
            elif len(change_value) and change_value[0] == '[':
                i = 1
                while i < len(change_value) and change_value[i] != ']':
                    i += 1
                i += 1
                ip = change_value[:i].lstrip('[').rstrip(']')
                change_value = change_value[i:]
            if ip:
                change['ip'] = validate_and_normalize_ip(ip)
            if change_value.startswith(':'):
                i = 1
                while i < len(change_value) and change_value[i].isdigit():
                    i += 1
                change['port'] = int(change_value[1:i])
                change_value = change_value[i:]
            if change_value.startswith('R'):
                change_value = change_value[1:]
                replication_ip = ''
                if len(change_value) and change_value[0].isdigit():
                    i = 1
                    while (i < len(change_value)
                           and change_value[i] in '0123456789.'):
                        i += 1
                    replication_ip = change_value[:i]
                    change_value = change_value[i:]
                elif len(change_value) and change_value[0] == '[':
                    i = 1
                    while i < len(change_value) and change_value[i] != ']':
                        i += 1
                    i += 1
                    replication_ip = \
                        change_value[:i].lstrip('[').rstrip(']')
                    change_value = change_value[i:]
                if replication_ip:
                    change['replication_ip'] = \
                        validate_and_normalize_ip(replication_ip)
                if change_value.startswith(':'):
                    i = 1
                    while i < len(change_value) and change_value[i].isdigit():
                        i += 1
                    change['replication_port'] = int(change_value[1:i])
                    change_value = change_value[i:]
            if change_value.startswith('/'):
                i = 1
                while i < len(change_value) and change_value[i] != '_':
                    i += 1
                change['device'] = change_value[1:i]
                change_value = change_value[i:]
            if change_value.startswith('_'):
                change['meta'] = change_value[1:]
                change_value = ''
            if change_value or not change:
                raise ValueError('Invalid set info change value: %s' %
                                 repr(argvish[1]))
            _set_info_values(devs, change)
    else:
        devs = builder.search_devs(parse_search_values_from_opts(opts))
        change = parse_change_values_from_opts(opts)
        _set_info_values(devs, change)