diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.osimage.validation b/xCAT-test/autotest/testcase/xcat-inventory/cases.osimage.validation new file mode 100644 index 000000000..372a34020 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.osimage.validation @@ -0,0 +1,52 @@ +start: xcat_inventory_import_validation_osimage +description: verify the validation mechanisom while importing osimage object + +cmd: rm -rf /tmp/xcat_inventory_import_validation_osimage +cmd: mkdir -p /tmp/xcat_inventory_import_validation_osimage +cmd: mkdir -p /tmp/xcat_inventory_import_validation_osimage/trash/ +cmd: mkdir -p /tmp/xcat_inventory_import_validation_osimage/backup/ +cmd: lsdef -t osimage -o testosimage1 -z 2>/dev/null >/tmp/xcat_inventory_import_validation_osimage/backup/testosimage1.stanza + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "role" "compute" "/tmp/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "role" "service" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "role" "invalid" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "role" "" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc!=0 + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "imagetype" "windows" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "imagetype" "linux" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "imagetype" "invalid" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "imagetype" "" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "provision_mode" "statelite" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "provision_mode" "install" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "provision_mode" "netboot" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "provision_mode" "invalid" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "provision_mode" "" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "genimgoptions.rootfstype" "nfs" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "genimgoptions.rootfstype" "ramdisk" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "genimgoptions.rootfstype" "invalid" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "osimage" "testosimage1" "genimgoptions.rootfstype" "" "/tmp/xcat_inventory_import_validation_osimage/trash/" +check: rc==0 + +cmd: cat /tmp/xcat_inventory_import_validation_osimage/backup/testosimage1.stanza 2>/dev/null |mkdef -z -f +cmd: rm -rf /tmp/xcat_inventory_import_validation_osimage +end diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.site.validation b/xCAT-test/autotest/testcase/xcat-inventory/cases.site.validation new file mode 100644 index 000000000..23a9237d3 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.site.validation @@ -0,0 +1,126 @@ +start: xcat_inventory_import_validation_site +description: verify the validation mechanisom while importing site object + +cmd: rm -rf /tmp/xcat_inventory_import_validation_site +cmd: mkdir -p /tmp/xcat_inventory_import_validation_site +cmd: mkdir -p /tmp/xcat_inventory_import_validation_site/trash/ +cmd: mkdir -p /tmp/xcat_inventory_import_validation_site/backup/ +cmd: lsdef -t site -o clustersite -z 2>/dev/null >/tmp/xcat_inventory_import_validation_site/backup/clustersite.stanza + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dbtracelevel" "0" "/tmp/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dbtracelevel" "1" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dbtracelevel" "2" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dbtracelevel" "3" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dbtracelevel" "4" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dbtracelevel" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dbtracelevel" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dhcplease" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dhcplease" "10240" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "dhcplease" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "disjointdhcps" "0" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "disjointdhcps" "1" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "disjointdhcps" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "disjointdhcps" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "httpport" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "httpport" "80" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "httpport" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "managedaddressmode" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "managedaddressmode" "static" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "managedaddressmode" "dhcp" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "managedaddressmode" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sharedinstall" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sharedinstall" "no" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sharedinstall" "sns" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sharedinstall" "all" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sharedinstall" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sshbetweennodes" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sshbetweennodes" "ALLGROUPS" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sshbetweennodes" "NOGROUPS" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "sshbetweennodes" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdebugmode" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdebugmode" "0" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdebugmode" "1" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdebugmode" "2" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdebugmode" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdport" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdport" "3001" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdport" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatdport" "3002" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatiport" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatiport" "3001" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatiport" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatiport" "3002" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 + + +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatlport" "" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatlport" "3001" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatlport" "invalid" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc!=0 +cmd: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/validatehelper "site" "clustersite" "xcatlport" "3003" "/tmp/xcat_inventory_import_validation_site/trash/" +check: rc==0 + +cmd: cat /tmp/xcat_inventory_import_validation_site/backup/clustersite.stanza 2>/dev/null |mkdef -z -f +cmd: rm -rf /tmp/xcat_inventory_import_validation_site +end diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/osimage.json b/xCAT-test/autotest/testcase/xcat-inventory/templates/osimage.json new file mode 100644 index 000000000..d35a00144 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/osimage.json @@ -0,0 +1,27 @@ +{ + "osimage": { + "testosimage1": { + "basic_attributes": { + "arch": "ppc64le", + "distribution": "sles12.2", + "osdistro": "sles12.2-ppc64le" + }, + "filestosync": "/install/custom/netboot/sles/compute.synclist", + "genimgoptions": { + "exlist": "/opt/xcat/share/xcat/netboot/sles/compute.sles12.ppc64le.exlist", + "postinstall": "/opt/xcat/share/xcat/netboot/sles/compute.sles12.ppc64le.postinstall", + "rootimgdir": "/install/netboot/sles12.2/ppc64le/compute", + "rootfstype": "nfs" + }, + "imagetype": "linux", + "package_selection": { + "otherpkgdir": "/install/post/otherpkgs/sles12.2/ppc64le", + "pkgdir": "/install/sles12.2/ppc64le", + "pkglist": "/opt/xcat/share/xcat/netboot/sles/compute.sles12.ppc64le.pkglist" + }, + "provision_mode": "statelite", + "role": "compute" + } + }, + "schema_version": "1.0" +} diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/osimage.yaml b/xCAT-test/autotest/testcase/xcat-inventory/templates/osimage.yaml new file mode 100644 index 000000000..f837d42fb --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/osimage.yaml @@ -0,0 +1,21 @@ +osimage: + testosimage1: + basic_attributes: + arch: ppc64le + distribution: sles12.2 + osdistro: sles12.2-ppc64le + filestosync: /install/custom/netboot/sles/compute.synclist + genimgoptions: + exlist: /opt/xcat/share/xcat/netboot/sles/compute.sles12.ppc64le.exlist + postinstall: /opt/xcat/share/xcat/netboot/sles/compute.sles12.ppc64le.postinstall + rootimgdir: /install/netboot/sles12.2/ppc64le/compute + rootfstype: nfs + imagetype: linux + package_selection: + otherpkgdir: /install/post/otherpkgs/sles12.2/ppc64le + pkgdir: /install/sles12.2/ppc64le + pkglist: /opt/xcat/share/xcat/netboot/sles/compute.sles12.ppc64le.pkglist + provision_mode: statelite + role: compute +schema_version: '1.0' + diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/site.json b/xCAT-test/autotest/testcase/xcat-inventory/templates/site.json new file mode 100644 index 000000000..6f86279a4 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/site.json @@ -0,0 +1,18 @@ +{ + "schema_version": "1.0", + "site": { + "clustersite": { + "dbtracelevel": "1", + "dhcplease": "10240", + "disjointdhcps": "0", + "httpport": "80", + "sharedinstall": "no", + "managedaddressmode": "dhcp", + "sshbetweennodes": "ALLGROUPS", + "xcatdebugmode": "0", + "xcatdport": "3001", + "xcatiport": "3002", + "xcatlport": "3003" + } + } +} diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/site.yaml b/xCAT-test/autotest/testcase/xcat-inventory/templates/site.yaml new file mode 100644 index 000000000..6a1e219a5 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/site.yaml @@ -0,0 +1,15 @@ +schema_version: '1.0' +site: + clustersite: + dbtracelevel: '1' + dhcplease: '10240' + disjointdhcps: '0' + httpport: '80' + sharedinstall: 'no' + managedaddressmode: 'dhcp' + sshbetweennodes: 'ALLGROUPS' + xcatdebugmode: '0' + xcatdport: '3001' + xcatiport: '3002' + xcatlport: '3003' + diff --git a/xCAT-test/autotest/testcase/xcat-inventory/validatehelper b/xCAT-test/autotest/testcase/xcat-inventory/validatehelper new file mode 100755 index 000000000..bedc695a7 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/validatehelper @@ -0,0 +1,267 @@ +#!/usr/bin/python +from __future__ import print_function + +import yaml +import json +import os +import re +import sys +import shutil +import subprocess + + +#remove the dict entries whose value is null or '' +def Util_rmnullindict(mydict): + for key in mydict.keys(): + if isinstance(mydict[key],dict): + Util_rmnullindict(mydict[key]) + if not mydict[key].keys(): + del mydict[key] + else: + if not mydict[key]: + del mydict[key] + + +# get the dict value mydict[a][b][c] with key path a.b.c +def Util_getdictval(mydict,keystr): + if not isinstance(mydict,dict): + return None + dictkeyregex=re.compile("([^\.]+)\.?(\S+)*") + result=re.findall(dictkeyregex,keystr) + if result: + (key,remdkey)=result[0] + if key not in mydict.keys(): + return None + if remdkey: + return Util_getdictval(mydict[key],remdkey) + else: + return mydict[key] + +# get the dict value mydict[a][b][c] with key path a.b.c +def Util_setdictval(mydict,keystr,value): + dictkeyregex=re.compile("([^\.]+)\.?(\S+)*") + result=re.findall(dictkeyregex,keystr) + if result: + (key,remdkey)=result[0] + if remdkey: + if key not in mydict.keys(): + mydict[key]={} + Util_setdictval(mydict[key],remdkey,value) + else: + mydict[key]=value + + +def GetAttrInFile(fpath,objtype,objname,attrpath): + f=open(fpath,'r') + try: + objdict=json.loads(f) + except TypeError,ValueError: + try: + objdict=yaml.load(f) + except Exception,e: + raise Exception("Error: cannot open file "+fpath+"! "+str(e)) + + f.close() + myattrpath=objtype+"."+objname+"."+attrpath + myvalue=Util_getdictval(objdict,myattrpath) + return myvalue + +def compattr(exptattr,rawattr): + if isinstance(exptattr,list) and re.match(r'^\[.*\]$',rawattr): + rawattr=eval(rawattr) + if isinstance(rawattr,str): + if rawattr in exptattr: + return 0 + else: + return 1 + else: + return cmp(exptattr,rawattr) + + + +def runCommand(cmd, env=None): + """ Run one command only, when you don't want to bother setting up + the Popen stuff. + """ + print('Running command: %s' %cmd) + try: + p = subprocess.Popen(cmd, + env=env, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + out, err = p.communicate() + except OSError,e: + print('RunCommand failed due to OSError %s' % e) + if p.returncode: + print('Command %s failed with return code %d : %s' % (cmd , p.returncode, err)) + print(out) + print(err) + return p.returncode + + +def UpdateAttrInFile(fpath,fformat,objtype,objname,attrpath,value): + f=open(fpath,'r') + try: + objdict=json.loads(f) + except TypeError,ValueError: + try: + objdict=yaml.load(f) + except Exception,e: + raise Exception("Error: cannot open file "+fpath+"! "+str(e)) + + f.close() + myattrpath=objtype+"."+objname+"."+attrpath + if value == "": + Util_setdictval(objdict,myattrpath,"") + Util_rmnullindict(objdict) + else: + origobjdict=Util_getdictval(objdict,myattrpath) + origattrtype=type(origobjdict) + newvalue=value + if origattrtype == list and re.match(r'^\[.*\]$',value): + #import pdb + #pdb.set_trace() + newvalue=eval(value) + if isinstance(origobjdict,list) and isinstance(newvalue,str): + newvalue=[newvalue] + Util_setdictval(objdict,myattrpath,newvalue) + f=open(fpath,'w') + if fformat == "yaml": + print(yaml.dump(objdict,default_flow_style=False),file=f) + elif fformat == "json": + print(json.dumps(objdict, sort_keys=True, indent=4, separators=(',', ': ')),file=f) + f.close() + +def removeobj(objtype,objname): + print("removing existing \""+objtype+"\" type object \""+objname+"\" from xCAT\n") + if str(objtype) in ('node','osimage','network','site','route','zone','policy'): + runCommand("rmdef -t "+objtype+" -o "+objname) + elif str(objtype) in ('passwd'): + runCommand("tabch -d key="+objname+" passwd") + +def Usage(): + print("Usage:\n") + print(sys.argv[0]+" [OBJTYPE OBJNAME ATTRIBUTE ATTRVALUE TMPDIR]") + +if len(sys.argv) < 6: + Usage() + exit(1) + + +objtype=str(sys.argv[1]) +objname=str(sys.argv[2]) +attribute=str(sys.argv[3]) +attrvalue=str(sys.argv[4]) +tmpdir=str(sys.argv[5]) +print("objtype=%s\nobjname=%s\nattribute=%s\nattrvalue=%s\ntmpdir=%s\n"%(objtype,objname,attribute,attrvalue,tmpdir)) + +if os.path.exists(tmpdir): + runCommand("rm -rf "+tmpdir) + +os.mkdir(tmpdir) + +print("Temporary directory to hold intermediate files: "+tmpdir+"\n") + +curdir=os.path.split(os.path.realpath(sys.argv[0]))[0] +yamldeftmpl=curdir+"/templates/"+objtype+'.yaml' +jsondeftmpl=curdir+"/templates/"+objtype+'.json' +yamldef=tmpdir+"/"+objtype+'.yaml' +jsondef=tmpdir+"/"+objtype+'.json' +yamldefout=tmpdir+"/"+objtype+'.out.yaml' +jsondefout=tmpdir+"/"+objtype+'.out.json' + +shutil.copyfile(yamldeftmpl,yamldef) +shutil.copyfile(jsondeftmpl,jsondef) + +rcfinal=0 +rcyaml=0 +rcjson=0 +rc=0 + +UpdateAttrInFile(yamldef,'yaml',objtype,objname,attribute,attrvalue) +print("=================the inventory file to import: "+yamldef+"=====================\n") +runCommand("cat "+yamldef) +print("===============================================================================\n") + + +print("import the inventory file "+yamldef+"\n") +rc=runCommand("xcat-inventory import -t "+objtype+" -o "+objname+" -f "+yamldef) +if rc !=0: + print("failed to import the inventory file "+yamldef) + rcyaml=1 +else: + print("the inventory file "+yamldef+" imported successfully\n") + print("export the \""+objtype+"\" type object \""+objname+"\" just imported\n") + rc=runCommand("xcat-inventory export -t "+objtype+" -o "+objname+" --format=yaml 1>"+yamldefout) + if rc!=0: + print("failed to export the \""+objtype+"\" type object \""+objname+"\"\n") + rcyaml=1 + else: + print("==============the exported inventory file "+yamldefout+"======================\n") + runCommand("cat "+yamldefout) + print("===========================================================================\n") + myattrvalue=GetAttrInFile(yamldefout,objtype,objname,attribute) + if attrvalue == '': + if myattrvalue is not None: + rcyaml=1 + else: + if compattr(myattrvalue,attrvalue) != 0 : + rcyaml=1 + +if rcyaml == 0: + print("yaml validation passed\n") +else: + print("yaml validation failed\n") + +removeobj(objtype,objname) + +UpdateAttrInFile(jsondef,'json',objtype,objname,attribute,attrvalue) +print("=================the inventory file to import: "+jsondef+"=====================\n") +runCommand("cat "+jsondef) +print("===============================================================================\n") + + +print("import the inventory file "+jsondef+"\n") +rc=runCommand("xcat-inventory import -t "+objtype+" -o "+objname+" -f "+jsondef) +print("rc="+str(rc)) +if rc !=0: + print("failed to import the inventory file "+jsondef) + rcjson=1 +else: + print("the inventory file "+jsondef+" imported successfully\n") + print("export the \""+objtype+"\" type object \""+objname+"\" just imported\n") + rc=runCommand("xcat-inventory export -t "+objtype+" -o "+objname+" --format=json 1>"+jsondefout) + if rc!=0: + print("failed to export the \""+objtype+"\" type object \""+objname+"\"\n") + rcjson=1 + else: + print("==============the exported inventory file "+jsondefout+"======================\n") + runCommand("cat "+jsondefout) + print("===========================================================================\n") + myattrvalue=GetAttrInFile(jsondefout,objtype,objname,attribute) + if attrvalue == '': + if myattrvalue is not None: + rcjson=1 + else: + if compattr(myattrvalue,attrvalue) != 0 : + rcjson=1 + +if rcjson ==0: + print("json validation passed\n") +else: + print("json validation failed\n") + +removeobj(objtype,objname) + +if rcjson !=0 or rcyaml!=0: + rcfinal=1 + +print("remove intermediate directory "+tmpdir) +if os.path.exists(tmpdir): + runCommand("rm -rf "+tmpdir) + +exit(rcfinal) + +