Skip to content

Commit

Permalink
Fix IP mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
JosepSampe committed Nov 7, 2017
1 parent 71f3508 commit 98a7ad8
Showing 1 changed file with 49 additions and 46 deletions.
95 changes: 49 additions & 46 deletions api/swift_api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from rest_framework.exceptions import ParseError
from rest_framework.parsers import JSONParser
from shutil import copyfile
from swiftclient import client as swift_client
from swiftclient import client as swift_client
from swift.common.ring import RingBuilder
from swift.common import exceptions
from operator import itemgetter
Expand All @@ -31,29 +31,29 @@
# Storage Policies
#

def update_sp_files(path, policy_id, dict):

object_builder_key = '' if policy_id == '0' else '-' + policy_id
storage_policy_key = 'storage-policy:' + policy_id

def update_sp_files(path, policy_id, d):
storage_policy_key = 'storage-policy:' + policy_id

swift_file = os.path.join(path, 'swift.conf')

configParser = ConfigParser.RawConfigParser()
configParser.read(swift_file)

if not configParser.has_section(storage_policy_key):
configParser.add_section(storage_policy_key)
for key, value in dict.iteritems():

for key, value in d.iteritems():
configParser.set(storage_policy_key, key, value)

with open(swift_file, 'wb') as configfile:
configParser.write(configfile)


def get_policy_file_path(dir_path, policy_id):
object_builder_key = 'object.builder' if policy_id == '0' else 'object-' + policy_id + '.builder'
return os.path.join(dir_path, object_builder_key)


def get_swift_cfg_path(dir_path):
return os.path.join(dir_path, 'swift.conf')

Expand Down Expand Up @@ -90,12 +90,12 @@ def storage_policies(request):
data = JSONParser().parse(request)

try:
id = str(r.incr('storage-policies:id'))
key = 'storage-policy:' + id
sp_id = str(r.incr('storage-policies:id'))
key = 'storage-policy:' + sp_id

ring = RingBuilder(int(data['partition_power']), int(data['replicas']), int(data['time']))
ring.save(get_policy_file_path(settings.SWIFT_CFG_TMP_DIR, id))
ring.save(get_policy_file_path(settings.SWIFT_CFG_TMP_DIR, sp_id))

r.hmset(key, data)
except:
return JSONResponse('Error creating the Storage Policy', status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Expand Down Expand Up @@ -139,7 +139,7 @@ def storage_policy_detail(request, storage_policy_id):
if r.exists(key):
data = JSONParser().parse(request)
try:
data['deployed'] = False
data['deployed'] = False
r.hmset(key, data)
return JSONResponse("Storage Policy updated", status=status.HTTP_201_CREATED)
except RedisError:
Expand All @@ -150,27 +150,26 @@ def storage_policy_detail(request, storage_policy_id):
if request.method == 'DELETE':
if r.exists(key):
try:

policy_file_path = get_policy_file_path(settings.SWIFT_CFG_DEPLOY_DIR, storage_policy_id)
policy_file_path = get_policy_file_path(settings.SWIFT_CFG_DEPLOY_DIR, storage_policy_id)
if os.path.isfile(policy_file_path):
os.remove(policy_file_path)
os.remove(get_policy_file_path(settings.SWIFT_CFG_TMP_DIR, storage_policy_id))

deploy_swift_file = get_swift_cfg_path(settings.SWIFT_CFG_DEPLOY_DIR)

configParser = ConfigParser.RawConfigParser()
configParser.read(deploy_swift_file)

configParser.remove_section(key)

with open(deploy_swift_file, 'wb') as configfile:
configParser.write(configfile)

r.delete(key)

if not r.keys('storage-policy:*'):
r.delete('storage-policies:id')

return JSONResponse("Storage Policy deleted", status=status.HTTP_201_CREATED)
except RedisError:
return JSONResponse("Error deleting storage policy", status=status.HTTP_400_BAD_REQUEST)
Expand Down Expand Up @@ -199,7 +198,7 @@ def storage_policy_disks(request, storage_policy_id):
node = r.hgetall(node_key)
all_devices += [node_key.split(':')[1] + ':' + device for device in json.loads(node['devices']).keys()]

current_devices = [ dev[0] for dev in storage_policy['devices']]
current_devices = [dev[0] for dev in storage_policy['devices']]
available_devices = [device for device in all_devices if device not in current_devices]
available_devices_detail = []
for device in available_devices:
Expand All @@ -217,26 +216,26 @@ def storage_policy_disks(request, storage_policy_id):
if request.method == 'PUT':
if r.exists(key):
disk = JSONParser().parse(request)

object_node_id, device_id = disk.split(':')
object_node = r.hgetall('object_node:' + object_node_id)
device_detail = json.loads(object_node['devices'])[device_id]
region = r.hgetall('region:' + object_node['region_id'])['name']
zone = r.hgetall('zone:' + object_node['zone_id'])['name']

tmp_policy_file = get_policy_file_path(settings.SWIFT_CFG_TMP_DIR, storage_policy_id)

ring = RingBuilder.load(tmp_policy_file)
ring_dev_id = ring.add_dev({'weight': 100, 'region': region, 'zone': zone, 'ip': object_node['ip'], 'port': '6000', 'device': device_id})
ring.save(tmp_policy_file)

storage_policy = r.hgetall(key)
storage_policy['devices'] = json.loads(storage_policy['devices'])
storage_policy['devices'].append((disk, ring_dev_id))
storage_policy['devices'] = json.dumps(storage_policy['devices'])
r.hset(key, 'devices', storage_policy['devices'])
r.hset(key, 'deployed', False)

return JSONResponse('Disk added correctly', status=status.HTTP_200_OK)
else:
return JSONResponse('Disk could not be added.', status=status.HTTP_400_BAD_REQUEST)
Expand All @@ -257,14 +256,14 @@ def delete_storage_policy_disks(request, storage_policy_id, disk_id):
if request.method == 'DELETE':
if r.exists(key):
try:

tmp_policy_file = get_policy_file_path(settings.SWIFT_CFG_TMP_DIR, storage_policy_id)

found = False
storage_policy = r.hgetall(key)
storage_policy['devices'] = json.loads(storage_policy['devices'])

for i,disk in enumerate(storage_policy['devices']):
for i, disk in enumerate(storage_policy['devices']):
if disk_id == disk[0]:
found = True
ring = RingBuilder.load(tmp_policy_file)
Expand All @@ -274,12 +273,12 @@ def delete_storage_policy_disks(request, storage_policy_id, disk_id):
storage_policy['devices'] = json.dumps(storage_policy['devices'])
r.hset(key, 'devices', storage_policy['devices'])
r.hset(key, 'deployed', False)

return JSONResponse("Disk removed", status=status.HTTP_204_NO_CONTENT)

if not found:
return JSONResponse('Disk not found', status=status.HTTP_404_NOT_FOUND)

except RedisError:
return JSONResponse("Error updating storage policy", status=status.HTTP_400_BAD_REQUEST)
else:
Expand All @@ -303,19 +302,19 @@ def deploy_storage_policy(request, storage_policy_id):
try:
tmp_policy_file = get_policy_file_path(settings.SWIFT_CFG_TMP_DIR, storage_policy_id)
deploy_policy_file = get_policy_file_path(settings.SWIFT_CFG_DEPLOY_DIR, storage_policy_id)

ring = RingBuilder.load(tmp_policy_file)
ring.rebalance()
ring.save(tmp_policy_file)

data = r.hgetall(key)
update_sp_files(settings.SWIFT_CFG_DEPLOY_DIR, storage_policy_id, {'name': data['name'], 'deprecated': data['deprecated'],
'default': data['default'], 'deployed': 'True'})
'default': data['default'], 'deployed': 'True'})

copyfile(tmp_policy_file, deploy_policy_file)

r.hset(key, 'deployed', 'True')

return JSONResponse('Storage policy deployed correctly', status=status.HTTP_200_OK)
except RedisError:
return JSONResponse('Storage policy could not be deployed', status=status.HTTP_400_BAD_REQUEST)
Expand Down Expand Up @@ -389,23 +388,27 @@ def load_swift_policies(request):
configParser.read(local_swift_file)
if configParser.has_section(key):

name = configParser.get(key, 'name') if configParser.has_option(key, 'name') else 'Policy-' + sp_id
name = configParser.get(key, 'name') if configParser.has_option(key, 'name') else 'Policy-' + sp_id
policy_type = configParser.get(key, 'policy_type') if configParser.has_option(key, 'policy_type') else 'Replication'
deprecated = configParser.get(key, 'deprecated') if configParser.has_option(key, 'deprecated') else 'False'

if configParser.has_option(key, 'default'):
default = 'True' if configParser.get(key, 'default') in ['yes', 'Yes'] else 'False'
else:
default = 'True' if configParser.get(key, 'default') in ['yes', 'Yes'] else 'False'
else:
default = 'False'


devices = []
nodes_data = {}
nodes = r.keys('*_node:*')
for node in nodes:
nodes_data[node] = r.hgetall(node)

for device in builder.devs:
try:
inet_aton(device['ip'])
device['ip'] = next((nodes_data[node]['name'] for node in nodes_data if nodes_data[node]['ip'] == device['ip']), device['ip'])
except:
device['ip'] = next((r.hgetall(key)['name'] for key in r.keys('*_node:*') if r.hgetall(key)['ip'] == device['ip']), device['ip'])

pass
devices.append((device['ip'] + ':' + device['device'], device['id']))

data = {'name': name,
Expand Down

0 comments on commit 98a7ad8

Please sign in to comment.