def cp_config_efs(yaml_path): # Find efs pod pods = settings.k8s.find_pod(namespace="default", keyword="test-efs") if not pods: return hiss.hiss('cannot find tiller pod') # Create folder config exec_command = [ '/bin/bash', '-c', 'mkdir -p %s/promconfig' % (settings.EFS_ROOT) ] result_create_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) if result_create_folder.success == False: return hiss.hiss('cannot remove folders in %s' % pods[0]) # Copy to efs pod target_file = '%s/promconfig/prometheus.yml' % settings.EFS_ROOT if not settings.k8s.cp_to_pod(podName=pods[0], namespace='default', source=yaml_path, target=target_file): return hiss.hiss('connot copy test chaincode to pod %s' % pods[0]) return True
def make_port_forward(self, podName, namespace, ports): try: resp = self.coreApi.connect_get_namespaced_pod_portforward( name=podName, namespace=namespace, ports=ports) return resp except ApiException as e: hiss.hiss( "Exception when calling CoreV1Api->connect_post_namespaced_pod_portforward: %s\n" % e)
def get_working_orgs_domain(): orgs = settings.PEER_ORGS.split(' ') if len(orgs) > 1: hiss.hiss('Function is still develop') domain = util.get_domain(orgs[0]) settings.k8s.prereqs(domain) return [orgs[0], domain]
def find_stateful_set(self, namespace, keyword): mypods = [] try: ret = self.appsApi.list_namespaced_stateful_set(namespace) for item in ret.items: if keyword in item.metadata.name: mypods.append(item.metadata.name) except ApiException as e: hiss.hiss("Exception when calling Api: %s\n" % e) return mypods
def find_pvc(self, namespace, keyword): list_pvc = [] try: ret = self.coreApi.list_namespaced_persistent_volume_claim(namespace) for item in ret.items: if keyword in item.metadata.name: list_pvc.append(item.metadata.name) except ApiException as e: hiss.hiss("Exception when calling Api: %s\n" % e) return list_pvc
def cp_to_pod(self, podName, namespace, source, target): if os.path.exists(source): sourcePath = source if os.path.isdir(sourcePath): sourcePath = '%s/.' % source cmd = 'kubectl cp %s -n %s %s:%s' % (sourcePath, namespace, podName, target) copyResult = os.system(cmd) if copyResult != 0: return hiss.hiss('cannot copy to pod') else: return hiss.hiss('file/folder \'%s\' does not exists' % source) return True
def setup_ica(ica_org): # Get domain ica to create namespace ica_domain = util.get_domain(ica_org) if not ica_domain: return hiss.hiss('Fail to get domain of %s ' % ica_org) # Create temp folder & namespace settings.k8s.prereqs(ica_domain) ica_name = 'ica-%s' % ica_org rca_host = settings.EXTERNAL_RCA_ADDRESSES if not settings.EXTERNAL_RCA_ADDRESSES: rca_host = '%s.%s' % (settings.RCA_NAME, settings.RCA_ORG) k8s_template_file = '%s/ica/fabric-deployment-ica.yaml' % util.get_k8s_template_path() dict_env = { 'ORG': ica_org, 'ICA_NAME': ica_name, 'ICA_DOMAIN': ica_domain, 'RCA_NAME': settings.RCA_NAME, 'RCA_HOST': rca_host, 'EFS_SERVER': settings.EFS_SERVER, 'EFS_PATH': settings.EFS_PATH, 'EFS_EXTEND': settings.EFS_EXTEND } settings.k8s.apply_yaml_from_template( namespace=ica_domain, k8s_template_file=k8s_template_file, dict_env=dict_env)
def delete_persistent_volume_claim(self, name, namespace): try: api_response = self.coreApi.delete_namespaced_persistent_volume_claim(name=name, namespace=namespace) return util.Result(success=True, data=api_response) except ApiException as e: err_msg = "Exception when calling CoreV1Api->delete_namespaced_persistent_volume_claim: %s\n" % e return util.Result(success=hiss.hiss(err_msg), msg=err_msg)
def delete_stateful(self, name, namespace, delete_pvc=False): action = 'Delete' if delete_pvc == True: action = 'Terminate' read_result = self.read_stateful_set(name, namespace) if read_result.success == False: return read_result volume_claim_templates = read_result.data.spec.volume_claim_templates if volume_claim_templates != None: for pvt in volume_claim_templates: pvt_name = pvt.metadata.name list_pvc = self.find_pvc(namespace, keyword=pvt_name) for pvc in list_pvc: hiss.echo('Delete pvc %s ' % pvc) self.delete_persistent_volume_claim( name=pvc, namespace=namespace) try: body = client.V1DeleteOptions(propagation_policy='Background') api_response = self.appsApi.delete_namespaced_stateful_set( name, namespace, body=body) self.check_pod_status_by_keyword(keyword=name, namespace=namespace, is_delete=True) hiss.echo('%s stateful set %s on namespace %s success' % (action, name, namespace)) return util.Result(success=True, data=api_response) except ApiException as e: err_msg = "Exception when calling AppsV1Api->delete_namespaced_stateful_set: %s\n" % e return util.Result(success=hiss.hiss(err_msg), msg=err_msg)
def delete(self): try: api_response = settings.k8s.coreApi.delete_namespace( name=self.name) return api_response except ApiException as e: return hiss.hiss( "Exception when calling CoreV1Api->delete_namespace: %s\n" % e)
def get_domain(org_name): orgs = settings.ORGS.split(' ') domains = settings.DOMAINS.split(' ') if org_name in orgs: return domains[orgs.index(org_name)] else: return hiss.hiss('org_name: %s does not exists in env file' % org_name)
def create_explorer_config_in_efs(explorer_config): # Find efs pod pods = settings.k8s.find_pod(namespace="default", keyword="test-efs") if not pods: return hiss.hiss('cannot find tiller pod') config_path = '%s/explorer-config' % settings.EFS_ROOT exec_command = [ '/bin/bash', '-c', 'mkdir -p '+config_path+'; cd '+config_path+'; echo '+explorer_config+' > config.json'] create_file = settings.k8s.exec_pod( podName=pods[0], namespace="default", command=exec_command) if create_file.success == False: return hiss.hiss('cannot create explorer config in %s' % pods[0])
def exec_pod(self, podName, namespace, command): try: resp = stream(self.coreApi.connect_get_namespaced_pod_exec, name=podName, namespace=namespace, stderr=True, stdin=True, stdout=True, command=command) # return util.resultDict(success=True, msg='Success', data=resp) return util.Result(success=True, msg='Success', data=resp) except ApiException as e: err_msg = "Exception when calling CoreV1Api->connect_get_namespaced_pod_exec: %s\n" % e return util.Result(success=hiss.hiss(err_msg), msg=err_msg)
def delete_job(self, name, namespace): try: body = client.V1DeleteOptions(propagation_policy='Background') api_response = self.batchApi.delete_namespaced_job(name, namespace, body=body) hiss.echo('Delete job %s on namespace %s success' % (name, namespace)) return util.Result(success=True, data=api_response) except ApiException as e: err_msg = "Exception when calling BatchV1Api->delete_namespaced_job: %s\n" % e return util.Result(success=hiss.hiss(err_msg), msg=err_msg)
def delete_ica(ica_org): ica_name = 'ica-%s' % ica_org # Get domain ica to create namespace ica_domain = util.get_domain(ica_org) if not ica_domain: return hiss.hiss('Fail to get domain of %s ' % ica_org) # Delete stateful set return settings.k8s.delete_stateful(name=ica_name, namespace=ica_domain)
def get(self): try: list = settings.k8s.coreApi.list_namespace() except ApiException as e: return hiss.hiss("Exception when calling CoreV1Api->list_namespace: %s\n" % e) ns = next((x for x in list.items if x.metadata.name == self.name), None) if not ns: return False else: return ns
def remove_cert(): ## Find explorer_db pod pods = settings.k8s.find_pod(namespace='default', keyword="test-efs") if not pods: return hiss.hiss('cannot find tiller pod') remove_cert = 'rm -rf %s/*' % (settings.EFS_ROOT) exec_command = ['/bin/bash', '-c', '%s' % (remove_cert)] return settings.k8s.exec_pod(podName=pods[0], namespace='default', command=exec_command)
def get_peer_external_domain(peer, index_peer): peers = settings.PEER_ORGS.split(' ') if index_peer == 0: ex_domains = settings.EXTERNAL_ORG_PEER0_ADDRESSES.split(' ') else: ex_domains = settings.EXTERNAL_ORG_PEER1_ADDRESSES.split(' ') if peer in peers: return ex_domains[peers.index(peer)] else: return hiss.hiss('peer: %s does not exists in env file' % peer)
def create_stateful_set(self, stsName, namespace, replicas, containers, volumes, volumeClaimTemplates): api_version = 'apps/v1' kind = 'StatefulSet' metadata = client.V1ObjectMeta(name=stsName, namespace=namespace) # Build spec_selector spec_selector_match_labels = dict() spec_selector_match_labels['name'] = stsName spec_selector_match_labels['namespace'] = namespace spec_selector = client.V1LabelSelector( match_labels=spec_selector_match_labels) # Build spec_template spec_template_metadata_labels = dict() spec_template_metadata_labels['name'] = stsName spec_template_metadata_labels['namespace'] = namespace spec_template_metadata = client.V1ObjectMeta( labels=spec_template_metadata_labels) spec_template_spec = client.V1PodSpec(containers=containers, volumes=volumes) spec_template = client.V1PodTemplateSpec( metadata=spec_template_metadata, spec=spec_template_spec) # Build spec spec = client.V1StatefulSetSpec( service_name=stsName, replicas=replicas, selector=spec_selector, template=spec_template, volume_claim_templates=volumeClaimTemplates) # Build body body = client.V1StatefulSet(api_version=api_version, kind=kind, metadata=metadata, spec=spec) # Create stateful set try: api_response = self.appsApi.create_namespaced_stateful_set( namespace=namespace, body=body) print('api_response: ', api_response) except ApiException as e: return hiss.hiss( "Exception when calling AppsV1Api->create_namespaced_stateful_set: %s\n" % e)
def setup_admin(): domains = settings.ORDERER_DOMAINS.split(' ') if len(domains) == 0: domains = settings.PEER_DOMAINS.split(' ') # Create application artifact folder hiss.echo('Create application artifact folder') ## Find efs pod pods = settings.k8s.find_pod(namespace="default", keyword="test-efs") if not pods: return hiss.hiss('cannot find tiller pod') mkdir_cmd = ('mkdir -p ' + settings.EFS_ROOT + '/admin/artifacts;' 'mkdir -p ' + settings.EFS_ROOT + '/admin/crypto-path;' 'mkdir -p ' + settings.EFS_ROOT + '/admin/crypto-store;') ## Exec command exec_command = ['/bin/bash', '-c', '%s' % (mkdir_cmd)] result_get_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) hiss.sub_echo(result_get_folder.data) # Create temp folder & namespace settings.k8s.prereqs(domains[0]) dict_env = { 'ORDERER_DOMAIN': domains[0], 'EFS_SERVER': settings.EFS_SERVER, 'EFS_PATH': settings.EFS_PATH, 'EFS_EXTEND': settings.EFS_EXTEND, 'PVS_PATH': settings.PVS_PATH } # Apply deployment k8s_template_file = '%s/admin-v1/admin-deployment.yaml' % util.get_k8s_template_path( ) settings.k8s.apply_yaml_from_template(namespace=domains[0], k8s_template_file=k8s_template_file, dict_env=dict_env) # Apply service k8s_template_file = '%s/admin-v1/admin-service.yaml' % util.get_k8s_template_path( ) settings.k8s.apply_yaml_from_template(namespace=domains[0], k8s_template_file=k8s_template_file, dict_env=dict_env)
def setup_explorer_db(): # Get domain explorer_db_namespace = get_namespace() # Create temp folder & namespace settings.k8s.prereqs(explorer_db_namespace) dict_env = { 'DOMAIN': explorer_db_namespace, 'DATABASE_PASSWORD': '******' } # Deploy explorer db sts explorer_db_template = '%s/explorer/explorer-db-deployment.yaml' % util.get_k8s_template_path( ) settings.k8s.apply_yaml_from_template( namespace=explorer_db_namespace, k8s_template_file=explorer_db_template, dict_env=dict_env) # Deploy explorer db svc explorer_db_svc_template = '%s/explorer/explorer-db-service.yaml' % util.get_k8s_template_path( ) settings.k8s.apply_yaml_from_template( namespace=explorer_db_namespace, k8s_template_file=explorer_db_svc_template, dict_env=dict_env) # Create tables ## Find explorer_db pod pods = settings.k8s.find_pod(namespace=explorer_db_namespace, keyword="explorer-db") if not pods: return hiss.hiss('cannot find tiller pod') create_tbl_cmd = 'chmod 700 /opt/createdb_new.sh; /opt/createdb_new.sh' exec_command = ['/bin/bash', '-c', '%s' % (create_tbl_cmd)] result_get_folder = settings.k8s.exec_pod(podName=pods[0], namespace=explorer_db_namespace, command=exec_command) hiss.sub_echo(result_get_folder.data)
def create(self): # Load template file k8s_template_file = '%s/namespace/namespaces.yaml' % util.get_k8s_template_path( ) with open(k8s_template_file, 'r') as sources: lines = sources.readlines() out_data = [] # Replace variable for line in lines: out_line = re.sub(r'{{NAMESPACES}}', self.name, line) out_data.append(out_line) # Get current datetime (UTC) current_time = datetime.datetime.utcnow().replace( microsecond=0).isoformat().split('T') # Make folder temp if it not exists tmp_path = "%s/%s" % (util.get_temp_path(), current_time[0]) util.make_folder(tmp_path) # Create yaml_path yaml_path = '%s/%s/%s_namespaces.yaml' % ( util.get_temp_path(), current_time[0], current_time[1]) # Write yaml -> yaml_path with open(yaml_path, "w") as sources: for line in out_data: sources.write(line) # Execute yaml with open(yaml_path) as f: dep = yaml.safe_load(f) try: settings.k8s.coreApi.create_namespace(body=dep) hiss.sub_echo('Create namespace successfully') return True except ApiException as e: return hiss.hiss( "Exception when calling CoreV1Api->create_namespace: %s\n" % e)
def extract_cfg(mamba_config, dev_mode): hiss.echo('Extract config to default config path: %s ' % DEFAULT_CONFIG_PATH) dotenv_path = get_template_env() if not os.path.isdir(mamba_config): os.makedirs(mamba_config) shutil.copy(dotenv_path, DEFAULT_CONFIG_PATH) load_dotenv(DEFAULT_CONFIG_PATH) default_cluster_name = os.getenv('EKS_CLUSTER_NAME') default_k8s_type = os.getenv('K8S_TYPE') deployment_mode = os.getenv('DEPLOYMENT_ENV') # Input cluster_name = input( f'Cluster name ({default_cluster_name}): ') or default_cluster_name k8s_type = input( f'Kubenetes type - support eks or minikube ({default_k8s_type}): ' ) or default_k8s_type if dev_mode: deployment_mode = 'develop' # Detect current environment setting # EFS_SERVER efs_server = detect_deployed_efs_server(k8s_type) # EFS_SERVER_ID efs_server_id = efs_server.split('.')[0] print('efs_server: ', efs_server) # EFS_PATH efs_path = detect_deployed_efs_path() # EFS_POD efs_pod = detect_deployed_efs_pod() if not efs_pod and k8s_type == 'eks': retry = 3 while retry > 0: efs_server = input('EFS server (*):') if efs_server: break retry -= 1 if not efs_server: hiss.hiss('Must specify EFS_SERVER!') exit() with open(DEFAULT_CONFIG_PATH, "r") as sources: lines = sources.readlines() with open(DEFAULT_CONFIG_PATH, "w") as sources: for line in lines: newline = re.sub(r'EKS_CLUSTER_NAME=.*', f'EKS_CLUSTER_NAME=\"{cluster_name}\"', line) newline = re.sub(r'K8S_TYPE=.*', f'K8S_TYPE=\"{k8s_type}\"', newline) if efs_server: newline = re.sub(r'EFS_SERVER=.*', f'EFS_SERVER=\"{efs_server}\"', newline) if efs_server_id: newline = re.sub(r'EFS_SERVER_ID=.*', f'EFS_SERVER_ID=\"{efs_server_id}\"', newline) if efs_path: newline = re.sub(r'EFS_PATH=.*', f'EFS_PATH=\"efs-{efs_path}\"', newline) if efs_pod: newline = re.sub(r'EFS_POD=.*', f'EFS_POD=\"{efs_pod}\"', newline) newline = re.sub(r'DEPLOYMENT_ENV=.*', f'DEPLOYMENT_ENV=\"{deployment_mode}\"', newline) sources.write(newline) hiss.rattle("See more config in %s" % DEFAULT_CONFIG_PATH)
def update_folder(): hiss.rattle('Update folder crt in EFS') # Find efs pod pods = settings.k8s.find_pod(namespace="default", keyword="test-efs") if not pods: return hiss.hiss('cannot find tiller pod') all_command = '' prepare_cmd = 'rm -rf %s/akc-ca-data/crypto-config-v1;' % settings.EFS_ROOT prepare_cmd += 'cd %s/akc-ca-data/;' % settings.EFS_ROOT all_command += prepare_cmd if settings.ORDERER_ORGS != '': # Build orderer command orderers = settings.ORDERER_ORGS.split(' ') orderer_cmd = '' for orderer in orderers: # Get domain domain = util.get_domain(orderer) orderer_cmd += ('' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/ca;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/msp/admincerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/msp/cacerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/msp/tlscacerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/tlsca;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/admincerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/cacerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/keystore;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/signcerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/tlscacerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/tls;' '') for index in range(int(settings.NUM_ORDERERS)): orderer_cmd += ( '' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/admincerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/cacerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/keystore;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/signcerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/tlscacerts;' 'mkdir -p crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/tls;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/cacerts/ca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/tlscacerts/tlsca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/tls/tlsca.' + domain + '-cert.pem;' 'cp crypto-config/' + orderer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/admincerts/cert.pem;' 'cp crypto-config/' + orderer + '.' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/signcerts/cert.pem crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/signcerts/;' 'cp crypto-config/' + orderer + '.' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/keystore/*_sk crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/msp/keystore/key.pem;' 'cp crypto-config/' + orderer + '.' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/tls/server.crt crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/tls/;' 'cp crypto-config/' + orderer + '.' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/tls/server.key crypto-config-v1/ordererOrganizations/' + domain + '/orderers/orderer' + str(index) + '-' + orderer + '.' + domain + '/tls/server.key;' '') orderer_cmd += ( '' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/ca/ca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/msp/cacerts/ca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/cacerts/ca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/tlsca/tlsca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/msp/tlscacerts/tlsca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/tlscacerts/tlsca.' + domain + '-cert.pem;' 'cp ica-' + orderer + '-ca-chain.pem crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/tls/tlsca.' + domain + '-cert.pem;' 'cp crypto-config/' + orderer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/ordererOrganizations/' + domain + '/msp/admincerts/cert.pem;' 'cp crypto-config/' + orderer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/admincerts/cert.pem;' 'cp crypto-config/' + orderer + '.' + domain + '/users/admin/msp/keystore/*_sk crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/keystore/key.pem;' 'cp crypto-config/' + orderer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/ordererOrganizations/' + domain + '/users/admin/msp/signcerts/cert.pem;' 'echo "succeed";' '') all_command += orderer_cmd # Build peer command peers = settings.PEER_ORGS.split(' ') peer_cmd = '' for peer in peers: # Get domain domain = util.get_domain(peer) peer_cmd += ('' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/ca;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/msp/admincerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/msp/cacerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/msp/tlscacerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/tlsca;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/admincerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/cacerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/keystore;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/signcerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/tlscacerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/users/admin/tls;' '') for index in range(int(settings.NUM_PEERS)): peer_cmd += ( '' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/admincerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/cacerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/keystore;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/signcerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/tlscacerts;' 'mkdir -p crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/tls;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/cacerts/ca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/tlscacerts/tlsca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/tls/tlsca.' + domain + '-cert.pem;' 'cp crypto-config/' + peer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/admincerts/cert.pem;' 'cp crypto-config/' + peer + '.' + domain + '/peers/peer' + str(index) + '-' + peer + '.' + domain + '/msp/signcerts/cert.pem crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/signcerts/;' 'cp crypto-config/' + peer + '.' + domain + '/peers/peer' + str(index) + '-' + peer + '.' + domain + '/msp/keystore/*_sk crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/msp/keystore/key.pem;' 'cp crypto-config/' + peer + '.' + domain + '/peers/peer' + str(index) + '-' + peer + '.' + domain + '/tls/server.crt crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/tls/;' 'cp crypto-config/' + peer + '.' + domain + '/peers/peer' + str(index) + '-' + peer + '.' + domain + '/tls/server.key crypto-config-v1/peerOrganizations/' + domain + '/peers/peer' + str(index) + '.' + domain + '/tls/server.key;' '') peer_cmd += ( '' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/ca/ca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/msp/cacerts/ca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/cacerts/ca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/tlsca/tlsca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/msp/tlscacerts/tlsca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/tlscacerts/tlsca.' + domain + '-cert.pem;' 'cp ica-' + peer + '-ca-chain.pem crypto-config-v1/peerOrganizations/' + domain + '/users/admin/tls/tlsca.' + domain + '-cert.pem;' 'cp crypto-config/' + peer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/peerOrganizations/' + domain + '/msp/admincerts/cert.pem;' 'cp crypto-config/' + peer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/admincerts/cert.pem;' 'cp crypto-config/' + peer + '.' + domain + '/users/admin/msp/keystore/* crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/keystore/key.pem;' 'cp crypto-config/' + peer + '.' + domain + '/users/admin/msp/signcerts/cert.pem crypto-config-v1/peerOrganizations/' + domain + '/users/admin/msp/signcerts/cert.pem;' '') all_command += peer_cmd # Exec command exec_command = ['/bin/bash', '-c', '%s' % (all_command)] result_get_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) hiss.sub_echo(result_get_folder.data) return True
def copy_scripts(): hiss.rattle('Copy scripts to EFS') # Find efs pod pods = settings.k8s.find_pod(namespace="default", keyword="test-efs") if not pods: return hiss.hiss('cannot find tiller pod') # Check empty folder exec_command = [ '/bin/bash', '-c', 'test -d %s && echo "1" || echo "0"' % (settings.EFS_ROOT) ] result_get_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) if int(result_get_folder.data) < 1: hiss.sub_echo('Folder %s not found. Creating...' % settings.EFS_ROOT) exec_command = [ '/bin/bash', '-c', 'mkdir -p %s/admin; mkdir -p %s/akc-ca-data' % (settings.EFS_ROOT, settings.EFS_ROOT) ] # Create folder in efs result_create_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) if result_create_folder.success == False: return hiss.hiss('cannot create folders in %s: %s' % (pods[0], result_create_folder.msg)) # Copy config to scripts/env hiss.sub_echo('Copy config to scripts/env') config_file = os.path.abspath(os.path.join(__package__, "../config/.env")) env_script_File = os.path.abspath( os.path.join(__package__, "../blockchain/scripts/env-scripts.sh")) copyfile(config_file, env_script_File) # Remove old script folder in efs hiss.sub_echo('Remove old script folder in efs') exec_command = [ '/bin/bash', '-c', 'rm -rf %s/akc-ca-scripts/*' % (settings.EFS_ROOT) ] result_create_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) if result_create_folder.success == False: return hiss.hiss('cannot remove folders in %s' % pods[0]) # Copy scripts folder to efs hiss.sub_echo('Copy scripts folder to efs') script_path = os.path.abspath( os.path.join(__package__, "../blockchain/scripts")) if not settings.k8s.cp_to_pod( podName=pods[0], namespace='default', source=script_path, target='%s/akc-ca-scripts' % settings.EFS_ROOT): return hiss.hiss('connot copy scripts folder to pod %s' % pods[0]) exec_command = [ '/bin/bash', '-c', ('test -d ' + settings.EFS_ROOT + '/akc-ca-scripts/akc-ca-scripts' ' && mv ' + settings.EFS_ROOT + '/akc-ca-scripts/akc-ca-scripts/* ' + settings.EFS_ROOT + '/akc-ca-scripts || echo "ok"') ] result_create_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) if result_create_folder.success == False: return hiss.hiss('cannot remove folders in %s' % pods[0]) # Copy test chaincode to efs hiss.sub_echo('Copy test chaincode to efs') artifacts_path = os.path.abspath( os.path.join(__package__, "../blockchain/artifacts")) if not settings.k8s.cp_to_pod( podName=pods[0], namespace='default', source=artifacts_path, target='%s/admin/artifacts' % settings.EFS_ROOT): return hiss.hiss('connot copy test chaincode to pod %s' % pods[0]) return True
def setup_admin(org): # Get domain domain = util.get_domain(org) # Get orderer information orderer_names = settings.ORDERER_ORGS.split(' ') orderer_domains = settings.ORDERER_DOMAINS.split(' ') if orderer_names == '' and settings.REMOTE_ORDERER_NAME != '': orderer_names = settings.REMOTE_ORDERER_NAME.split(' ') orderer_domains = settings.REMOTE_ORDERER_DOMAIN.split(' ') # Build endorsement config peer_orgs = '%s %s' % (settings.PEER_ORGS, settings.ENDORSEMENT_ORG_NAME) peer_domains = '%s %s' % (settings.PEER_DOMAINS, settings.ENDORSEMENT_ORG_DOMAIN) print(peer_orgs) # Create application artifact folder hiss.echo('Create wallet folder') ## Find efs pod pods = settings.k8s.find_pod(namespace="default", keyword="test-efs") if not pods: return hiss.hiss('cannot find tiller pod') mkdir_cmd = ('mkdir -p ' + settings.EFS_ROOT + '/admin-v2/wallet;') # Exec command exec_command = ['/bin/bash', '-c', '%s' % (mkdir_cmd)] result_get_folder = settings.k8s.exec_pod(podName=pods[0], namespace="default", command=exec_command) hiss.sub_echo(result_get_folder.data) # Create temp folder & namespace settings.k8s.prereqs(domain) dict_env = { 'ORG_NAME': org, 'ORG_DOMAIN': domain, 'PEER_NAMES': peer_orgs, 'PEER_DOMAINS': peer_domains, 'ORDERER_DOMAIN': orderer_domains[0], 'ORGDERER_NAME': orderer_names[0], 'EFS_SERVER': settings.EFS_SERVER, 'EFS_PATH': settings.EFS_PATH, 'EFS_EXTEND': settings.EFS_EXTEND, 'PVS_PATH': settings.PVS_PATH } # Apply deployment k8s_template_file = '%s/admin/admin-deployment.yaml' % util.get_k8s_template_path( ) settings.k8s.apply_yaml_from_template(namespace=domain, k8s_template_file=k8s_template_file, dict_env=dict_env) # Apply service k8s_template_file = '%s/admin/admin-service.yaml' % util.get_k8s_template_path( ) settings.k8s.apply_yaml_from_template(namespace=domain, k8s_template_file=k8s_template_file, dict_env=dict_env)