cic-cli/cic/network.py

149 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# standard imports
import os
import json
import logging
# external imports
from chainlib.chain import ChainSpec
# local imports
from .base import (
Data,
data_dir,
)
logg = logging.getLogger(__name__)
class Network(Data):
"""Contains network settings for token deployments across extensions.
Extension targets are defined by the keys immediately following the "resources" key in the network settings file.
:param path: Path to settings directory
:type path: str
:param targets: Extension targets to execute
:type targets: list of str
"""
def __init__(self, path='.', targets=[]):
super(Network, self).__init__()
self.resources = None
self.path = path
self.targets = targets
self.network_path = os.path.join(self.path, 'network.json')
def load(self):
"""Load network settings from file.
"""
super(Network, self).load()
f = open(self.network_path, 'r')
o = json.load(f)
f.close()
self.resources = o['resources']
self.inited = True
def start(self):
"""Initialize network settings with targets chosen at object instantiation.
Will save to network settings file.
"""
super(Network, self).load()
network_template_file_path = os.path.join(data_dir, f'network_template_v{self.version()}.json')
f = open(network_template_file_path)
o_part = json.load(f)
f.close()
self.resources = {}
for v in self.targets:
self.resources[v] = o_part
self.save()
def save(self):
"""Save network settings to file.
"""
f = open(self.network_path, 'w')
json.dump({
'resources': self.resources,
}, f, sort_keys=True, indent="\t")
f.close()
def resource(self, k):
"""Get settings definitions for a given extension.
:param k: Extension key
:type k: str
:rtype: dict
:return: Extension settings
"""
v = self.resources.get(k)
if v == None:
raise AttributeError('no defined reference for {}'.format(k))
return v
def resource_set(self, resource_key, content_key, reference, key_account=None):
"""Set the values a content part of an extension setting.
The content parts define network application resources. Each entry is keyed by the name of the application. Each value consists of a key_account used to write/deploy to the contract, and the reference (address) of the application resource. If no application resource yet exists on the network for the part, the reference value will be None.
:param resource_key: Extension key
:type resource_key: str
:param content_key: Resource name (e.g. smart contract name)
:type content_key: str
:param reference: Reference to resource on network (e.g. smart contract address)
:type reference: str
:param key_account: Address of account to sign transaction for the resource with
:type key_account: str
"""
self.resources[resource_key]['contents'][content_key]['reference'] = reference
self.resources[resource_key]['contents'][content_key]['key_account'] = key_account
def chain_spec(self, k):
"""Retrieve chain spec for the given extension
:param k: Extension key
:type k: str
:rtype: chainlib.chain.ChainSpec
:return: Chain spec object
"""
v = self.resource(k)
return ChainSpec.from_dict(v['chain_spec'])
def set(self, resource_key, chain_spec):
"""Set chain spec for resource.
:param resource_key: Extension key
:type resource_key: str
:param chain_spec: Chain spec to set
:type chain_spec: chainlib.chain.ChainSpec
"""
chain_spec_dict = chain_spec.asdict()
for k in chain_spec_dict.keys():
logg.debug('resources {}'.format(self.resources))
self.resources[resource_key]['chain_spec'][k] = chain_spec_dict[k]
def __str__(self):
s = ''
for resource in self.resources.keys():
for content_key in self.resources[resource]['contents'].keys():
content_value = self.resources[resource]['contents'][content_key]
if content_value == None:
content_value = ''
s += f'{resource}.{content_key} = {content_value}\n'
return s