Beispiel #1
0
def channel_tx(opts, verbose=False):
    peer_namespace = get_namespace(opts, opts['peers']['msp'])
    # Change to blockchain materials directory
    chdir(opts['core']['dir_config'])
    # Create Channel Tx
    channel_file = '{channel}.tx'.format(channel=opts['peers']['channel_name'])
    if not path.exists(channel_file):
        # Channel transaction creation and storage
        execute(
            'configtxgen -profile {channel_profile} -channelID {channel} -outputCreateChannelTx {channel_file}'
            .format(channel_profile=opts['peers']['channel_profile'],
                    channel=opts['peers']['channel_name'],
                    channel_file=channel_file),
            verbose=verbose)
    else:
        print('{channel}.tx already exists'.format(
            channel=opts['peers']['channel_name']))
    # Create the channel transaction secret
    secret_from_file(secret=opts['peers']['secret_channel'],
                     namespace=peer_namespace,
                     key=channel_file,
                     filename=channel_file,
                     verbose=verbose)
    # Return to original directory
    chdir(PWD)
Beispiel #2
0
def genesis_block(opts):
    """Create and save Genesis Block to K8S.

    Args:
        opts (dict): Nephos options dict.
    """
    ord_namespace = get_namespace(opts, opts["orderers"]["msp"])
    # Change to blockchain materials directory
    chdir(opts["core"]["dir_config"])
    # Create the genesis block
    genesis_key = "genesis.block"
    genesis_file = join(opts["core"]["dir_crypto"], genesis_key)
    if not exists(genesis_file):
        # Genesis block creation and storage
        execute(
            f"configtxgen -profile OrdererGenesis -outputBlock {genesis_file}",
        )
    else:
        logging.info(f"{genesis_file} already exists")
    # Create the genesis block secret
    secret_from_file(
        secret=opts["orderers"]["secret_genesis"],
        namespace=ord_namespace,
        key=genesis_key,
        filename=genesis_file,
    )
    # Return to original directory
    chdir(PWD)
Beispiel #3
0
def genesis_block(opts, verbose=False):
    """Create and save Genesis Block to K8S.

    Args:
        opts (dict): Nephos options dict.
        verbose (bool) Verbosity. False by default.
    """
    ord_namespace = get_namespace(opts, opts["orderers"]["msp"])
    # Change to blockchain materials directory
    chdir(opts["core"]["dir_config"])
    # Create the genesis block
    genesis_key = "genesis.block"
    genesis_file = join(opts["core"]["dir_crypto"], genesis_key)
    if not exists(genesis_file):
        # Genesis block creation and storage
        execute(
            "configtxgen -profile OrdererGenesis -outputBlock {genesis_file}".
            format(genesis_file=genesis_file),
            verbose=verbose,
        )
    else:
        print("{} already exists".format(genesis_file))
    # Create the genesis block secret
    secret_from_file(
        secret=opts["orderers"]["secret_genesis"],
        namespace=ord_namespace,
        key=genesis_key,
        filename=genesis_file,
        verbose=verbose,
    )
    # Return to original directory
    chdir(PWD)
Beispiel #4
0
def deploy_composer(opts, upgrade=False, verbose=False):
    """Deploy Hyperledger Composer on K8S.

    We use the hl-composer Helm chart as a basis to deploying Composer
    on K8S. Please note that Composer is unmaintained and may eventually
    be deprecated from this repository as we migrate to raw Fabric.

    Args:
        opts (dict): Nephos options dict.
        upgrade (bool): Do we upgrade the deployment? False by default.
        verbose (bool): Verbosity. False by default.
    """
    peer_namespace = get_namespace(opts, opts["peers"]["msp"])
    # Ensure BNA exists
    secret_from_file(
        secret=opts["composer"]["secret_bna"], namespace=peer_namespace, verbose=verbose
    )
    composer_connection(opts, verbose=verbose)

    # Start Composer
    if not upgrade:
        helm_install(
            opts["core"]["chart_repo"],
            "hl-composer",
            opts["composer"]["name"],
            peer_namespace,
            pod_num=3,
            config_yaml="{dir}/hl-composer/{release}.yaml".format(
                dir=opts["core"]["dir_values"], release=opts["composer"]["name"]
            ),
            verbose=verbose,
        )
    else:
        # TODO: Implement upgrade: set $CA_USERNAME and $CA_PASSWORD
        pass
Beispiel #5
0
def channel_tx(opts):
    """Create and save Channel Transaction to K8S.

    Args:
        opts (dict): Nephos options dict.
    """
    peer_namespace = get_namespace(opts, opts["peers"]["msp"])
    # Change to blockchain materials directory
    chdir(opts["core"]["dir_config"])
    # Create Channel Tx
    channel_key = f"{opts['peers']['channel_name']}.tx"
    channel_file = join(opts["core"]["dir_crypto"], channel_key)
    if not exists(channel_file):
        # Channel transaction creation and storage
        execute(
            f"configtxgen -profile {opts['peers']['channel_profile']} -channelID {opts['peers']['channel_name']} -outputCreateChannelTx {channel_file}",
        )
    else:
        logging.info(f"{channel_file} already exists")
    # Create the channel transaction secret
    secret_from_file(
        secret=opts["peers"]["secret_channel"],
        namespace=peer_namespace,
        key=channel_key,
        filename=channel_file,
    )
    # Return to original directory
    chdir(PWD)
Beispiel #6
0
def channel_tx(opts, verbose=False):
    """Create and save Channel Transaction to K8S.

    Args:
        opts (dict): Nephos options dict.
        verbose (bool) Verbosity. False by default.
    """
    peer_namespace = get_namespace(opts, opts["peers"]["msp"])
    # Change to blockchain materials directory
    chdir(opts["core"]["dir_config"])
    # Create Channel Tx
    channel_key = "{channel}.tx".format(channel=opts["peers"]["channel_name"])
    channel_file = join(opts["core"]["dir_crypto"], channel_key)
    if not exists(channel_file):
        # Channel transaction creation and storage
        execute(
            "configtxgen -profile {channel_profile} -channelID {channel} -outputCreateChannelTx {channel_file}".format(
                channel_profile=opts["peers"]["channel_profile"],
                channel=opts["peers"]["channel_name"],
                channel_file=channel_file,
            ),
            verbose=verbose,
        )
    else:
        print("{} already exists".format(channel_file))
    # Create the channel transaction secret
    secret_from_file(
        secret=opts["peers"]["secret_channel"],
        namespace=peer_namespace,
        key=channel_key,
        filename=channel_file,
        verbose=verbose,
    )
    # Return to original directory
    chdir(PWD)
Beispiel #7
0
 def test_secret_from_file(self, mock_secret_read, mock_secret_create,
                           mock_input_files, mock_open):
     mock_secret_read.side_effect = ApiException()
     secret_from_file("a_secret", "a-namespace")
     mock_secret_read.assert_called_once()
     mock_secret_create.assert_called_once()
     mock_input_files.assert_called_once()
     mock_open.assert_not_called()
Beispiel #8
0
def crypto_secret(secret_name, namespace, file_path, key, verbose=False):
    secret_files = glob(path.join(file_path, '*'))
    if len(secret_files) != 1:
        raise Exception('We should only find one file in this directory')
    secret_from_file(secret=secret_name,
                     namespace=namespace,
                     key=key,
                     filename=secret_files[0],
                     verbose=verbose)
Beispiel #9
0
 def test_secret_from_file_define(self, mock_secret_read,
                                  mock_secret_create, mock_input_files,
                                  mock_open):
     mock_secret_read.side_effect = ApiException()
     secret_from_file('a_secret', 'a-namespace', filename='./some_file.txt')
     mock_secret_read.assert_called_once()
     mock_secret_create.assert_called_once()
     mock_input_files.assert_not_called()
     mock_open.assert_called_once()
Beispiel #10
0
def deploy_composer(opts, upgrade=False, verbose=False):
    """Deploy Hyperledger Composer on K8S.

    We use the hl-composer Helm chart as a basis to deploying Composer
    on K8S. Please note that Composer is unmaintained and may eventually
    be deprecated from this repository as we migrate to raw Fabric.

    Args:
        opts (dict): Nephos options dict.
        upgrade (bool): Do we upgrade the deployment? False by default.
        verbose (bool): Verbosity. False by default.
    """
    peer_namespace = get_namespace(opts, opts["peers"]["msp"])
    # Ensure BNA exists
    secret_from_file(secret=opts["composer"]["secret_bna"],
                     namespace=peer_namespace,
                     verbose=verbose)
    composer_connection(opts, verbose=verbose)

    # Start Composer
    version = get_version(opts, "hl-composer")
    config_yaml = "{dir}/hl-composer/{release}.yaml".format(
        dir=opts["core"]["dir_values"], release=opts["composer"]["name"])
    if not upgrade:
        extra_vars = helm_extra_vars(version=version, config_yaml=config_yaml)
        helm_install(
            opts["core"]["chart_repo"],
            "hl-composer",
            opts["composer"]["name"],
            peer_namespace,
            extra_vars=extra_vars,
            verbose=verbose,
        )
    else:
        preserve = (HelmPreserve(
            peer_namespace,
            "{}-hl-composer-rest".format(opts["composer"]["name"]),
            "COMPOSER_APIKEY",
            "rest.config.apiKey",
        ), )
        extra_vars = helm_extra_vars(version=version,
                                     config_yaml=config_yaml,
                                     preserve=preserve)
        helm_upgrade(
            opts["core"]["chart_repo"],
            "hl-composer",
            opts["composer"]["name"],
            extra_vars=extra_vars,
            verbose=verbose,
        )
    helm_check("hl-composer",
               opts["composer"]["name"],
               peer_namespace,
               pod_num=3)
Beispiel #11
0
def upgrade_network(opts, verbose=False):
    """Upgrade Hyperledger Composer network.

    Args:
        opts (dict): Nephos options dict.
        verbose (bool): Verbosity. False by default.
    """
    peer_namespace = get_namespace(opts, opts["peers"]["msp"])
    secret_from_file(
        secret=opts["composer"]["secret_bna"], namespace=peer_namespace, verbose=verbose
    )
    # Set up the PeerAdmin card
    hlc_cli_ex = get_helm_pod(peer_namespace, "hlc", "hl-composer", verbose=verbose)

    bna, _ = hlc_cli_ex.execute("ls /hl_config/blockchain_network")
    bna_name, bna_rem = bna.split("_")
    bna_version, _ = bna_rem.split(".bna")
    peer_msp = opts["peers"]["msp"]
    bna_admin = opts["msps"][peer_msp]["org_admin"]

    res, _ = hlc_cli_ex.execute(
        "composer network ping --card {bna_admin}@{bna_name}".format(
            bna_admin=bna_admin, bna_name=bna_name
        )
    )

    curr_version = (res.split("Business network version: ")[1]).split()[0]
    print(curr_version)

    if curr_version != bna_version:
        hlc_cli_ex.execute(
            (
                "composer network install --card PeerAdmin@hlfv1 "
                + "--archiveFile /hl_config/blockchain_network/{bna}"
            ).format(bna=bna)
        )
        hlc_cli_ex.execute(
            (
                "composer network upgrade "
                + "--card PeerAdmin@hlfv1 "
                + "--networkName {bna_name} --networkVersion {bna_version}"
            ).format(bna_name=bna_name, bna_version=bna_version)
        )
        res, _ = hlc_cli_ex.execute(
            "composer network ping --card {bna_admin}@{bna_name}".format(
                bna_admin=bna_admin, bna_name=bna_name
            )
        )
        curr_version = (res.split("Business network version: ")[1]).split()[0]
        print("Upgraded to {version}".format(version=curr_version))
Beispiel #12
0
def crypto_secret(secret_name, namespace, file_path, key):
    """Create a crypto-material secret.

    Args:
        secret_name (str): Name of secret.
        namespace (str): Namespace for secret to be located.
        file_path (str): Path to file we want to store as a secret.
        key (str): Key (file) name of secret we want to store as a secret.
    """
    secret_files = glob(path.join(file_path, "*"))
    if len(secret_files) != 1:
        raise Exception("We should only find one file in this directory")
    secret_from_file(
        secret=secret_name, namespace=namespace, key=key, filename=secret_files[0]
    )
Beispiel #13
0
def genesis_block(opts, verbose=False):
    ord_namespace = get_namespace(opts, opts['orderers']['msp'])
    # Change to blockchain materials directory
    chdir(opts['core']['dir_config'])
    # Create the genesis block
    if not path.exists('genesis.block'):
        # Genesis block creation and storage
        execute(
            'configtxgen -profile OrdererGenesis -outputBlock genesis.block',
            verbose=verbose)
    else:
        print('genesis.block already exists')
    # Create the genesis block secret
    secret_from_file(secret=opts['orderers']['secret_genesis'],
                     namespace=ord_namespace,
                     key='genesis.block',
                     filename='genesis.block',
                     verbose=verbose)
    # Return to original directory
    chdir(PWD)
Beispiel #14
0
def deploy_composer(opts, upgrade=False, verbose=False):
    peer_namespace = get_namespace(opts, opts['peers']['msp'])
    # Ensure BNA exists
    secret_from_file(secret=opts['composer']['secret_bna'],
                     namespace=peer_namespace,
                     verbose=verbose)
    composer_connection(opts, verbose=verbose)

    # Start Composer
    if not upgrade:
        helm_install(opts['core']['chart_repo'],
                     'hl-composer',
                     opts['composer']['name'],
                     peer_namespace,
                     pod_num=3,
                     config_yaml='{dir}/hl-composer/{release}.yaml'.format(
                         dir=opts['core']['dir_values'],
                         release=opts['composer']['name']),
                     verbose=verbose)
    else:
        # TODO: Implement upgrade: set $CA_USERNAME and $CA_PASSWORD
        pass