summaryrefslogtreecommitdiffstats
path: root/ufo/gluster/swift/common/ring.py
blob: 9bac39c751b94c2579e6b43fce81c4c347d2626f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Copyright (c) 2013 Red Hat, Inc.
#
# 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.

from ConfigParser import ConfigParser
from swift.common.ring import ring
from swift.common.utils import search_tree
from gluster.swift.common.Glusterfs import SWIFT_DIR

reseller_prefix = "AUTH_"
conf_files = search_tree(SWIFT_DIR, "proxy-server*", 'conf')
if conf_files:
    conf_file = conf_files[0]

_conf = ConfigParser()
if conf_files and _conf.read(conf_file):
    if _conf.defaults().get("reseller_prefix", None):
        reseller_prefix = _conf.defaults().get("reseller_prefix")
    else:
        for key, value in _conf._sections.items():
            if value.get("reseller_prefix", None):
                reseller_prefix = value["reseller_prefix"]
                break

if not reseller_prefix.endswith('_'):
    reseller_prefix = reseller_prefix + '_'

class Ring(ring.Ring):
    def get_nodes(self, account, container=None, obj=None):
        """
        Get the partition and nodes for an account/container/object.
        If a node is responsible for more than one replica, it will
        only appear in the output once.
        :param account: account name
        :param container: container name
        :param obj: object name
        :returns: a tuple of (partition, list of node dicts)

        Each node dict will have at least the following keys:
        ======  ===============================================================
        id      unique integer identifier amongst devices
        weight  a float of the relative weight of this device as compared to
                others; this indicates how many partitions the builder will try
                to assign to this device
        zone    integer indicating which zone the device is in; a given
                partition will not be assigned to multiple devices within the
                same zone
        ip      the ip address of the device
        port    the tcp port of the device
        device  the device's name on disk (sdb1, for example)
        meta    general use 'extra' field; for example: the online date, the
                hardware description
        ======  ===============================================================
        """
        false_node = [{'zone': 1, 'weight': 100.0, 'ip': '127.0.0.1', 'id': 0, \
                           'meta': '', 'device': 'volume_not_in_ring', \
                           'port': 6012}]
        if account.startswith(reseller_prefix):
            acc_name = account.replace(reseller_prefix, '', 1)
        else:
            acc_name = account

        part = 0
        seen_ids = set()
        nodes = [dev for dev in self._devs \
                     if dev['device'] == acc_name \
                     and not (dev['id'] in seen_ids \
                                  or seen_ids.add(dev['id']))]
        if not nodes:
            nodes = false_node
        return part, nodes