Source code for nephos.composer.connection_template

#   Copyright [2018] [Alejandro Vicente Grabovetsky via AID:Tech]
#
#   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.

import json

from nephos.fabric.settings import get_namespace

"""Connection template.

This module sets up a connection_json for Hyperledger Composer.
"""


# TODO: We need to improve this to be better organised, and use information from Kubernetes:
# TODO: Peer addresses should depend on whether we are using internal addresses only or using an ingress.
# TODO: Organisation name/subdomain should be a variable
# TODO: Ports should depend on whether internal/external addresses
# TODO: CA Host should be obtained via Kubernetes configuration
[docs]def define_orderers(orderer_names, orderer_hosts, domain=None): """Define orderers as connection objects. Args: orderer_names (Iterable): List of orderer names. orderer_hosts (Iterable): List of orderer hosts. domain (str): Domain used. Defaults to none. Returns: dict: A dictionary of Orderer Connections """ orderer_connections = {} for name, host in zip(orderer_names, orderer_hosts): if domain: key = "{name}.{domain}".format(name=name, domain=domain) else: key = name orderer_connections[key] = {"url": ("grpc://" + host + ":7050")} return orderer_connections
[docs]def define_peers(peer_names, peer_hosts, organisation, domain=None): """Define peers as connection objects. Args: peer_names (Iterable): List of peer names. peer_hosts (Iterable): List of peer hosts. organisation (str): What organisation the peers belong to domain (str): Domain used. Defaults to none. Returns: tuple: A tuple of dictionaries with Peer Options and Peer Connections. """ peer_options = {} peer_connections = {} for name, host in zip(peer_names, peer_hosts): if domain: key = "{name}.{organisation}.{domain}".format( name=name, organisation=organisation, domain=domain ) else: key = name peer_options[key] = { "chaincodeQuery": True, "endorsingPeer": True, "eventSource": True, "ledgerQuery": True, } peer_connections[key] = { "url": ("grpc://" + host + ":7051"), "eventUrl": ("grpc://" + host + ":7053"), } return peer_options, peer_connections
[docs]def json_ct(opts, ca_name, ca_host, organisation, domain, msp_id, channel): """JSON connection template. Args: opts (dict): Nephos options dict. ca_name (str): Name of CA for Peers. ca_host (str): CA host address. organisation (str): What organisation the peers belong to. domain (str): Domain used. msp_id (str): ID of the MSP of the peers. channel (str): Channel name. Returns: dict: A dictionary representing the JSON connection template. """ # Derive variables peer_namespace = get_namespace(opts, opts["peers"]["msp"]) ord_namespace = get_namespace(opts, opts["orderers"]["msp"]) # TODO: Currently specific to intra-cluster communication (Service) peer_hosts = [ peer + "-hlf-peer.{ns}.svc.cluster.local".format(ns=peer_namespace) for peer in opts["peers"]["names"] ] orderer_hosts = [ orderer + "-hlf-ord.{ns}.svc.cluster.local".format(ns=ord_namespace) for orderer in opts["orderers"]["names"] ] # Get peers peer_options, peer_connections = define_peers( opts["peers"]["names"], peer_hosts, organisation, domain ) peer_names = [key for key, value in peer_options.items()] # Get orderers orderer_connections = define_orderers( opts["orderers"]["names"], orderer_hosts, domain ) orderer_names = [key for key, value in orderer_connections.items()] return json.dumps( { "name": "hlfv1", "x-type": "hlfv1", "x-commitTimeout": 100, "version": "1.0.0", "client": { "organization": organisation, "connection": { "timeout": { "peer": { "endorser": "300", "eventHub": "300", "eventReg": "300", }, "orderer": "300", } }, }, "channels": {channel: {"orderers": orderer_names, "peers": peer_options}}, "organizations": { organisation: { "mspid": msp_id, "peers": peer_names, "certificateAuthorities": [ca_name], } }, "orderers": orderer_connections, "peers": peer_connections, "certificateAuthorities": { ca_name: { "url": ("https://" + ca_host + ":443"), "caName": ca_name, # TODO: Ideally this should be set to True "httpOptions": {"verify": False}, } }, } )