Source code for contrail_api_cli.commands.edit
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
import tempfile
from six import b
import subprocess
import json
from ..command import Command, Arg, Option, expand_paths
from ..resource import Resource
from ..exceptions import CommandError
from ..utils import md5
[docs]class Edit(Command):
"""Edit a resource.
The resource JSON will be opened in an editor. If modifications
have been made and the file is saved the resource will be sent
to the API server.
The `--template` option can be used to create a new resource based
on an existing resource.
"""
description = "Edit resource"
path = Arg(nargs=1, help="Resource path",
complete='resources::path')
template = Option('-t',
help="Create new resource from existing",
action="store_true", default=False)
aliases = ['vim = edit', 'emacs = edit', 'nano = edit']
def __call__(self, path=None, template=False):
resources = expand_paths(path,
predicate=lambda r: isinstance(r, Resource))
if len(resources) > 1:
raise CommandError("Can't edit multiple resources")
resource = resources[0]
# don't show childs or back_refs
resource.fetch(exclude_children=True, exclude_back_refs=True)
resource.pop('id_perms')
if template:
resource.pop('href')
resource.pop('uuid')
editor = os.environ.get('EDITOR', 'vim')
with tempfile.NamedTemporaryFile(suffix='tmp.json') as tmp:
tmp.write(b(resource.json()))
tmp.flush()
tmp_md5 = md5(tmp.name)
subprocess.call([editor, tmp.name])
tmp.seek(0)
if tmp_md5 == md5(tmp.name):
print("No modification made, doing nothing...")
return
data_json = tmp.read().decode('utf-8')
try:
data = json.loads(data_json)
except ValueError as e:
raise CommandError('Provided JSON is not valid: ' + str(e))
if template:
# create new resource
resource = Resource(resource.type, **data)
else:
resource.update(data)
resource.save()