Exemple #1
0
    def createyamlforneworgs(self, id, peer_orgs):
        ins = modelv2.BlockchainNetwork.objects.get(id=id)

        host = ins.host
        consensus_type = ins.consensus_type
        fabric_version = ins.fabric_version
        peer_org_dicts = []
        orderer_org_dicts = []
        
        filepath = file_define.commad_create_path(id)
        print("filepath = {}".format(filepath))

        for org_id in peer_orgs:
            peer_org_dict = org_handler().schema(org_handler().get_by_id(org_id))
            peer_org_dicts.append(peer_org_dict)

            #logger.info(" before function file_define.commad_create_path,and path is")
            # create filepath with network_id at path FABRIC_DIR

            fileorgpath = '{}/{}'.format(filepath,org_id)
            os.system('mkdir -p {}/crypto-config/peerOrganizations/'.format(fileorgpath))
            #logger.info(" after function file_define.commad_create_path,and path is {}".format(filepath))

            if host.type == 'docker':
                # create crypto-config.yaml file at filepath
                file_define.dump_crypto_config_yaml_file(fileorgpath, peer_org_dicts, orderer_org_dicts)

                # create configtx.yaml file
                file_define.dump_configtx_yaml_file(fileorgpath, consensus_type, peer_org_dicts, orderer_org_dicts,
                                                    fabric_version)
            else:
                # create crypto-config.yaml file at filepath
                file_define.dump_crypto_config_yaml_file_k8s(fileorgpath, peer_org_dicts, orderer_org_dicts)

                # create configtx.yaml file
                file_define.dump_configtx_yaml_file_k8s(fileorgpath, consensus_type, peer_org_dicts, orderer_org_dicts,
                                                    fabric_version)

            try:
                # change work dir to '/opt'
                origin_dir = os.getcwd()
                os.chdir(fileorgpath)
                print(os.getcwd())

                os.system("export FABRIC_CFG_PATH=$PWD")
                mspid = '{}MSP'.format(peer_org_dict['name'][0:1].upper()+peer_org_dict['name'][1:])
                orgname = peer_org_dict['name']
                org_domain = peer_org_dict['domain']
                orgdir = '{}.{}'.format(orgname,org_domain)
                #call("/opt/fabric_tools/v1_1/cryptogen generate --config=%s/crypto-config.yaml" % fileorgpath, shell=True)
                os.system('cp -r {}/crypto-config/peerOrganizations/{} {}/crypto-config/peerOrganizations/'.format(filepath, orgdir, fileorgpath))
                call("/opt/fabric_tools/v1_1/configtxgen -printOrg %s > ../channel-artifacts/%s.json" % (mspid, orgname), shell=True)

                os.chdir(origin_dir)
                os.system('rm -r {}'.format(fileorgpath))
            except:
                error_msg = 'create certificate or genesis block failed!'
                raise Exception(error_msg)

        return self._schema(ins)
Exemple #2
0
    def createyamlforneworgs(self, id, peer_orgs, orderer_orgs):
        ins = modelv2.BlockchainNetwork.objects.get(id=id)

        filepath = file_define.commad_create_path(id)
        print("filepath = {}".format(filepath))

        for org_id in peer_orgs:
            peer_org_dict = org_handler().schema(
                org_handler().get_by_id(org_id))

            fileorgpath = '{}/{}'.format(filepath, org_id)
            os.system('mkdir -p {}/crypto-config/peerOrganizations/'.format(
                fileorgpath))

            try:
                # change work dir to '/opt'
                origin_dir = os.getcwd()
                os.chdir(fileorgpath)
                print(os.getcwd())

                os.system("export FABRIC_CFG_PATH=$PWD")
                mspid = '{}MSP'.format(peer_org_dict['name'][0:1].upper() +
                                       peer_org_dict['name'][1:])
                orgname = peer_org_dict['name']
                org_domain = peer_org_dict['domain']
                orgdir = '{}.{}'.format(orgname, org_domain)
                #call("/opt/fabric_tools/v1_1/cryptogen generate --config=%s/crypto-config.yaml" % fileorgpath, shell=True)
                os.system(
                    'cp -r {}/crypto-config/peerOrganizations/{} {}/crypto-config/peerOrganizations/'
                    .format(filepath, orgdir, fileorgpath))
                os.system('cp -r {}/configtx.yaml {}/'.format(
                    filepath, fileorgpath))
                call(
                    "/opt/fabric_tools/v1_4/configtxgen -printOrg %s > ../channel-artifacts/%s.json"
                    % (mspid, orgname),
                    shell=True)

                os.chdir(origin_dir)
                os.system('rm -r {}'.format(fileorgpath))
            except:
                error_msg = 'create certificate or genesis block failed!'
                raise Exception(error_msg)
        if orderer_orgs != None:
            org_id = orderer_orgs[0]

            orderer_org_dict = org_handler().schema(
                org_handler().get_by_id(org_id))

            fileorgpath = '{}/{}'.format(filepath, org_id)
            os.system('mkdir -p {}/crypto-config/ordererOrganizations/'.format(
                fileorgpath))

            try:
                # change work dir to '/opt'
                origin_dir = os.getcwd()
                os.chdir(fileorgpath)
                print(os.getcwd())

                os.system("export FABRIC_CFG_PATH=$PWD")
                mspid = '{}Org'.format(orderer_org_dict['name'][0:1].upper() +
                                       orderer_org_dict['name'][1:])
                orgname = orderer_org_dict['name']
                org_domain = orderer_org_dict['domain']
                orgdir = '{}'.format(org_domain)
                #call("/opt/fabric_tools/v1_1/cryptogen generate --config=%s/crypto-config.yaml" % fileorgpath, shell=True)
                os.system(
                    'cp -r {}/crypto-config/ordererOrganizations/{} {}/crypto-config/ordererOrganizations/'
                    .format(filepath, orgdir, fileorgpath))
                os.system('cp -r {}/configtx.yaml {}/'.format(
                    filepath, fileorgpath))
                call(
                    "/opt/fabric_tools/v1_4/configtxgen -printOrg %s > ../channel-artifacts/%s.json"
                    % (mspid, orgname),
                    shell=True)

                os.chdir(origin_dir)
                os.system('rm -r {}'.format(fileorgpath))
            except:
                error_msg = 'create certificate or genesis block failed!'
                raise Exception(error_msg)
        return self._schema(ins)
Exemple #3
0
    def addpeertonetwork(self, id, peer_org, peers_num):
        ins = modelv2.BlockchainNetwork.objects.get(id=id)
        host = ins.host
        fabric_version = ins.fabric_version
        name = ins.name

        peer_org_dict = org_handler().schema(org_handler().get_by_id(peer_org))

        db_type = ins.db_type
        couchdb_enabled = False
        if db_type == 'couchdb':
            couchdb_enabled = True
        ### get fabric service ports
        peer_num = peers_num
        peer_org_dict['peerNum'] += peers_num

        if couchdb_enabled is True:
            request_host_port_num = peer_num * PEER_NODE_HOSTPORT_NUM + \
                                    peer_num * COUCHDB_NODE_HOSTPORT_NUM
        else:
            request_host_port_num = peer_num * PEER_NODE_HOSTPORT_NUM

        request_host_ports = self.find_free_start_ports(
            request_host_port_num, host)

        if len(request_host_ports) != request_host_port_num:
            error_msg = "no enough ports for network service containers"
            logger.error(error_msg)
            raise Exception(error_msg)

        # logger.info(" before function file_define.commad_create_path,and path is")
        # create filepath with network_id at path FABRIC_DIR
        filepath = file_define.commad_create_path(id)
        print("filepath = {}".format(filepath))
        # logger.info(" after function file_define.commad_create_path,and path is {}".format(filepath))
        # create crypto-config.yaml file at filepath

        file_define.update_crypto_file_for_addpeers(filepath, peer_org_dict,
                                                    peers_num)

        try:
            # change work dir to '/opt'
            origin_dir = os.getcwd()
            os.chdir(filepath)
            print(os.getcwd())
            # create certificates
            call(
                "/opt/fabric_tools/v1_4/cryptogen extend --config=%s/crypto-config.yaml"
                % filepath,
                shell=True)

            os.chdir(origin_dir)
            # os.system('rm -r {}'.format(fileorgpath))
        except:
            error_msg = 'create certificate or genesis block failed!'
            raise Exception(error_msg)
        try:
            sk_file = ''
            org_name = peer_org_dict['name']
            org_domain = peer_org_dict['domain']
            org_fullDomain_name = '.'.join([org_name, org_domain])
            ca_dir = '/opt/fabric/{net_dir}/crypto-config/peerOrganizations/{org_fullDomain_name}/ca/'. \
                format(net_dir=id, org_fullDomain_name=org_fullDomain_name)
            for f in os.listdir(ca_dir):  # find out sk!
                if f.endswith("_sk"):
                    sk_file = f
            peer_org_dict['sk_file'] = sk_file
        except:
            error_msg = 'create_userdashboard failed!.'
            raise Exception(error_msg)

        # use network model to get?
        # network models only have org ids, no details needed
        network_config = {
            'id': id,
            'name': name,
            'fabric_version': fabric_version,
            'peer_org_dict': peer_org_dict,
            'peer_num': peers_num,
            'db_type': db_type
        }

        t = Thread(target=self._update_network_for_addpeers,
                   args=(network_config, request_host_ports))
        t.start()

        return self._schema(ins)
Exemple #4
0
    def addorgtonetwork(self, id, peer_orgs, orderer_orgs):
        ins = modelv2.BlockchainNetwork.objects.get(id=id)
        host = ins.host
        consensus_type = ins.consensus_type
        fabric_version = ins.fabric_version
        name = ins.name
        peer_org_dicts = []
        orderer_org_dicts = []
        peer_orgs_temp = ins.peer_orgs
        orderer_orgs_temp = ins.orderer_orgs
        if peer_orgs != None:
            for org_id in peer_orgs:
                peer_org_dict = org_handler().schema(
                    org_handler().get_by_id(org_id))
                peer_org_dicts.append(peer_org_dict)
                peer_orgs_temp.append(org_id)
        if orderer_orgs != None:
            org_id = orderer_orgs
            orderer_org_dict = org_handler().schema(
                org_handler().get_by_id(org_id))
            orderer_org_dicts.append(orderer_org_dict)
            orderer_orgs_temp.append(org_id)

        db_type = ins.db_type
        couchdb_enabled = False
        if db_type == 'couchdb':
            couchdb_enabled = True
        ### get fabric service ports
        peer_org_num = len(peer_org_dicts)
        peer_num = 0
        orderer_num = 0
        for org in peer_org_dicts:
            peer_num += org['peerNum']
        for org in orderer_org_dicts:
            orderer_num += len(org['ordererHostnames'])

        if couchdb_enabled is True:
            request_host_port_num = peer_org_num * CA_NODE_HOSTPORT_NUM + \
                                        peer_num * PEER_NODE_HOSTPORT_NUM + \
                                        peer_num * COUCHDB_NODE_HOSTPORT_NUM + \
                                        orderer_num * ORDERER_NODE_HOSTPORT_NUM
        else:
            request_host_port_num = peer_org_num * CA_NODE_HOSTPORT_NUM + \
                                        peer_num * PEER_NODE_HOSTPORT_NUM + \
                                        orderer_num * ORDERER_NODE_HOSTPORT_NUM

        request_host_ports = self.find_free_start_ports(
            request_host_port_num, host)

        if len(request_host_ports) != request_host_port_num:
            error_msg = "no enough ports for network service containers"
            logger.error(error_msg)
            raise Exception(error_msg)

        #logger.info(" before function file_define.commad_create_path,and path is")
        # create filepath with network_id at path FABRIC_DIR
        filepath = file_define.commad_create_path(id)
        print("filepath = {}".format(filepath))
        #logger.info(" after function file_define.commad_create_path,and path is {}".format(filepath))
        # create crypto-config.yaml file at filepath

        file_define.update_crypto_config_yaml_file(filepath, peer_org_dicts,
                                                   orderer_org_dicts)

        # create configtx.yaml file
        file_define.update_dump_configtx_yaml_file(filepath, peer_org_dicts,
                                                   orderer_org_dicts,
                                                   request_host_ports)

        try:
            # change work dir to '/opt'
            origin_dir = os.getcwd()
            os.chdir(filepath)
            print(os.getcwd())
            # create certificates
            call(
                "/opt/fabric_tools/v1_4/cryptogen extend --config=%s/crypto-config.yaml"
                % filepath,
                shell=True)

            os.chdir(origin_dir)
            #os.system('rm -r {}'.format(fileorgpath))
        except:
            error_msg = 'create certificate or genesis block failed!'
            raise Exception(error_msg)

        self.createyamlforneworgs(id, peer_orgs, orderer_orgs)

        self.sys_channelInfo_update(id, peer_org_dicts)

        ins.update(set__peer_orgs=peer_orgs_temp)

        self.sys_channelOrderer_update(id, orderer_org_dicts,
                                       request_host_ports)

        ins.update(set__orderer_orgs=orderer_orgs_temp)

        try:
            # create fabric-ca-server-config.yaml file
            file_define.fabric_ca_config_files(id, fabric_version,
                                               CELLO_MASTER_FABRIC_DIR,
                                               peer_org_dicts)
        except:
            error_msg = 'create fabric_ca_config_files failed!.'
            raise Exception(error_msg)

        # use network model to get?
        # network models only have org ids, no details needed
        network_config = {
            'id': id,
            'name': name,
            'fabric_version': fabric_version,
            'orderer_org_dicts': orderer_org_dicts,
            'peer_org_dicts': peer_org_dicts,
            'consensus_type': consensus_type,
            'db_type': db_type,
            'host': host
        }

        t = Thread(target=self._update_network,
                   args=(network_config, request_host_ports))
        t.start()

        return self._schema(ins)
Exemple #5
0
    def create(self, id, name, description, fabric_version, orderer_orgs,
               peer_orgs, host, consensus_type, db_type, create_ts):

        peer_org_dicts = []
        orderer_org_dicts = []
        for org_id in peer_orgs:
            peer_org_dict = org_handler().schema(
                org_handler().get_by_id(org_id))
            # blocakchain_network_id非空,表明该组织已添加到其他nework中
            if peer_org_dict['blockchain_network_id']:
                error_msg = ': this org has been added by another network!'
                raise Exception(error_msg)
            peer_org_dicts.append(peer_org_dict)
        for org_id in orderer_orgs:
            orderer_org_dict = org_handler().schema(
                org_handler().get_by_id(org_id))
            if orderer_org_dict['blockchain_network_id']:
                error_msg = ': this org has been added by another network!'
                raise Exception(error_msg)
            orderer_org_dicts.append(orderer_org_dict)

        network = modelv2.BlockchainNetwork(id=id,
                                            name=name,
                                            description=description,
                                            fabric_version=fabric_version,
                                            orderer_orgs=orderer_orgs,
                                            peer_orgs=peer_orgs,
                                            host=host,
                                            consensus_type=consensus_type,
                                            db_type=db_type,
                                            create_ts=create_ts,
                                            status="creating")
        network.save()

        order_orgs_domain = []
        for each in orderer_org_dicts:
            if each['domain'] not in order_orgs_domain:
                order_orgs_domain.append(each['domain'])
            else:
                network.delete()
                error_msg = ': orderer\'s domain in one network can not be same!'
                raise Exception(error_msg)

        couchdb_enabled = False
        if db_type == 'couchdb':
            couchdb_enabled = True

        ### get fabric service ports
        peer_org_num = len(peer_org_dicts)
        peer_num = 0
        orderer_num = 0
        # zsh修改,原本在_create_network中,为组织增加network信息,前调到这里
        for org in peer_org_dicts:
            peer_num += org['peerNum']
            org_obj = modelv2.Organization.objects.get(id=org['id'])
            org_obj.update(set__network=network)
        for org in orderer_org_dicts:
            orderer_num += len(org['ordererHostnames'])
            org_obj = modelv2.Organization.objects.get(id=org['id'])
            org_obj.update(set__network=network)

        if couchdb_enabled is True:
            request_host_port_num = peer_org_num * CA_NODE_HOSTPORT_NUM + \
                                        peer_num * PEER_NODE_HOSTPORT_NUM + \
                                        peer_num * COUCHDB_NODE_HOSTPORT_NUM + \
                                        orderer_num * ORDERER_NODE_HOSTPORT_NUM
        else:
            request_host_port_num = peer_org_num * CA_NODE_HOSTPORT_NUM + \
                                        peer_num * PEER_NODE_HOSTPORT_NUM + \
                                        orderer_num * ORDERER_NODE_HOSTPORT_NUM

        request_host_ports = self.find_free_start_ports(
            request_host_port_num, host)
        if len(request_host_ports) != request_host_port_num:
            error_msg = "no enough ports for network service containers"
            logger.error(error_msg)
            raise Exception(error_msg)

        # create persistent volume path for peer and orderer node
        # TODO : code here

        logger.info(
            " before function file_define.commad_create_path,and path is")
        # create public.key or private.key
        isExist = file_define.creat_secret_key_files()
        if not isExist:
            logger.error(
                " after function file_define.creat_secret_key_files, and it is {} "
                .format(isExist))
        # create filepath with network_id at path FABRIC_DIR
        filepath = file_define.commad_create_path(id)
        print("filepath = {}".format(filepath))
        logger.info(
            " after function file_define.commad_create_path,and path is {}".
            format(filepath))
        # create crypto-config.yaml file at filepath

        file_define.dump_crypto_config_yaml_file(filepath, peer_org_dicts,
                                                 orderer_org_dicts)

        # create configtx.yaml file
        file_define.dump_configtx_yaml_file(filepath, consensus_type,
                                            peer_org_dicts, orderer_org_dicts,
                                            fabric_version, request_host_ports)
        # create channel-artifacts path
        blockGenesis_filepath = '{}{}/channel-artifacts'.format(
            CELLO_MASTER_FABRIC_DIR, id)
        try:
            os.system('mkdir -p {}'.format(blockGenesis_filepath))
        except:
            error_msg = 'blockGenesis_filepath file create failed.'
            # raise FileOperaterFailed(error_msg)

        try:
            fabric_version_dir = fabric_version.replace('.', '_')
            # change work dir to '/opt'
            # origin_dir = os.getcwd()
            os.chdir(filepath)
            # print(os.getcwd())
            # create certificates
            call([
                "/opt/fabric_tools/{}/cryptogen".format(fabric_version_dir),
                "generate", "--config=./crypto-config.yaml"
            ])

            # create genesis.block and channel configuration blocks
            call([
                "/opt/fabric_tools/{}/configtxgen".format(fabric_version_dir),
                "-profile", "TwoOrgsOrdererGenesis", "-outputBlock",
                "./channel-artifacts/genesis.block"
            ])
            # call(["/opt/configtxgen","-profile","TwoOrgsChannel","-outputCreateChannelTx","./channel-artifacts/channel.tx","-channelID","mychannel"])
            # call(["/opt/configtxgen","-profile","TwoOrgsChannel","-outputAnchorPeersUpdate","./channel-artifacts/Org1MSPanchors.tx",\
            #  "-channelID","mychannel","-asOrg","Org1MSP"])
            # call(["/opt/configtxgen","-profile","TwoOrgsChannel","-outputAnchorPeersUpdate","./channel-artifacts/Org2MSPanchors.tx",\
            #  "-channelID","mychannel","-asOrg","Org2MSP"])

            # change back

            # for k8s orderer node to use genesis.block
            shutil.copy(
                '{}/genesis.block'.format(blockGenesis_filepath),
                '{}{}/crypto-config/ordererOrganizations/'.format(
                    CELLO_MASTER_FABRIC_DIR, id))
            # os.chdir(origin_dir)
        except Exception as e:
            error_msg = 'create certificate or genesis block failed!'
            self.remove_network(network)
            raise Exception(error_msg)

        try:
            # create fabric-ca-server-config.yaml file
            file_define.fabric_ca_config_files(id, fabric_version,
                                               CELLO_MASTER_FABRIC_DIR,
                                               peer_org_dicts)
        except:
            error_msg = 'create fabric_ca_config_files failed!.'
            self.remove_network(network)
            raise Exception(error_msg)

        # use network model to get?
        # no. network models only have org ids, no details needed
        network_config = {
            'id': id,
            'name': name,
            'fabric_version': fabric_version,
            'orderer_org_dicts': orderer_org_dicts,
            'peer_org_dicts': peer_org_dicts,
            'consensus_type': consensus_type,
            'db_type': db_type,
            'host': host
        }

        t = Thread(target=self._create_network,
                   args=(network_config, request_host_ports))
        t.start()

        return self._schema(network)