| 1 | #!/usr/bin/python | 
|---|
| 2 |  | 
|---|
| 3 | # policies.py | 
|---|
| 4 | # | 
|---|
| 5 | # Author:  M. Shankar, Jan 31, 2012 | 
|---|
| 6 | # Modification History | 
|---|
| 7 | #        Jan 31, 2012, Shankar: Initial version of policies.py with comments. | 
|---|
| 8 | #        May 14, 2012, Li, Shankar: Added support for archiving extra fields into policy file. | 
|---|
| 9 | # | 
|---|
| 10 | # This is the policies.py used to enforce policies for archiving PVs | 
|---|
| 11 | # At a very high level, when users request PVs to be archived, the mgmt web app samples the PV to determine event rate and other parameters. | 
|---|
| 12 | # In addition, various fields of the PV like .NAME, .ADEL, .MDEL, .RTYP etc are also obtained | 
|---|
| 13 | # These are passed to this python script as a dictionary argument to a method called determinePolicy | 
|---|
| 14 | # The variable name in the python environment for this information is 'pvInfo' (so use other variable names etc.). | 
|---|
| 15 | # The method is expected to use this information to make decisions on various archiving parameters. | 
|---|
| 16 | # The result is expected to be another dictionary that is placed into the variable called "pvPolicy". | 
|---|
| 17 | # Optionally, fields in addition to the VAL field that are to be archived with the PV are passed in as a property of pvPolicy called 'archiveFields' | 
|---|
| 18 | # If the user overrides the policy, this is communicated in the pvinfo as a property called 'policyName' | 
|---|
| 19 | # | 
|---|
| 20 | # In addition, this script must communicate the list of available policies to the JVM as another method called getPolicyList which takes no arguments. | 
|---|
| 21 | # The results of this method is placed into a variable called called 'pvPolicies'. | 
|---|
| 22 | # The dictionary is a name to description mapping - the description is used in the UI; the name is what is communicated to determinePolicy as a user override | 
|---|
| 23 | # | 
|---|
| 24 | # In addition, this script must communicate the list of fields that are to be archived as part of the stream in a method called getFieldsArchivedAsPartOfStream. | 
|---|
| 25 | # The results of this method is placed into a list variable called called 'pvStandardFields'. | 
|---|
| 26 |  | 
|---|
| 27 |  | 
|---|
| 28 | import sys | 
|---|
| 29 | import os | 
|---|
| 30 |  | 
|---|
| 31 | # Generate a list of policy names. This is used to feed the dropdown in the UI. | 
|---|
| 32 | def getPolicyList(): | 
|---|
| 33 | pvPoliciesDict = {} | 
|---|
| 34 | pvPoliciesDict['Default'] = 'The default policy' | 
|---|
| 35 | pvPoliciesDict['VAC'] = 'MR Vacuum' | 
|---|
| 36 | pvPoliciesDict['test - BPMS'] = 'test - BPMS that generate more than 1GB a year' | 
|---|
| 37 | pvPoliciesDict['test - 2HzPVs'] = 'test - PVs with an event rate more than 2Hz' | 
|---|
| 38 | pvPoliciesDict['test - 3DaysMTSOnly'] = 'test -Store data for 3 days upto the MTS only.' | 
|---|
| 39 | return pvPoliciesDict | 
|---|
| 40 |  | 
|---|
| 41 | # Define a list of fields that will be archived as part of every PV. | 
|---|
| 42 | # The data for these fields will included in the stream for the PV. | 
|---|
| 43 | # We also make an assumption that the data type for these fields is the same as that of the .VAL field | 
|---|
| 44 | def getFieldsArchivedAsPartOfStream(): | 
|---|
| 45 | return ['HIHI','HIGH','LOW','LOLO','LOPR','HOPR','DRVH','DRVL']; | 
|---|
| 46 |  | 
|---|
| 47 |  | 
|---|
| 48 | # We use the environment variables ARCHAPPL_SHORT_TERM_FOLDER and ARCHAPPL_MEDIUM_TERM_FOLDER to determine the location of the STS and the MTS in the appliance | 
|---|
| 49 | # PARTITION_5MIN / PARTITION_15MIN / PARTITION_30MIN / PARTITION_HOUR / PARTITION_DAY / PARTITION_MONTH / PARTITION_YEAR | 
|---|
| 50 | #shorttermstore_plugin_url = 'pb://localhost?name=STS&rootFolder=${ARCHAPPL_SHORT_TERM_FOLDER}&partitionGranularity=PARTITION_5MIN' | 
|---|
| 51 | #mediumtermstore_plugin_url = 'pb://localhost?name=MTS&rootFolder=${ARCHAPPL_MEDIUM_TERM_FOLDER}&partitionGranularity=PARTITION_15MIN' | 
|---|
| 52 | shorttermstore_plugin_url = 'pb://localhost?name=STS&rootFolder=${ARCHAPPL_SHORT_TERM_FOLDER}&partitionGranularity=PARTITION_HOUR' | 
|---|
| 53 | mediumtermstore_plugin_url = 'pb://localhost?name=MTS&rootFolder=${ARCHAPPL_MEDIUM_TERM_FOLDER}&partitionGranularity=PARTITION_DAY&hold=5&gather=1' | 
|---|
| 54 | longtermstore_plugin_url = 'pb://localhost?name=LTS&rootFolder=${ARCHAPPL_LONG_TERM_FOLDER}&partitionGranularity=PARTITION_MONTH' | 
|---|
| 55 | # | 
|---|
| 56 | #shorttermstore_plugin_url = 'pb://localhost?name=STS&rootFolder=${ARCHAPPL_SHORT_TERM_FOLDER}&partitionGranularity=PARTITION_5MIN' | 
|---|
| 57 | #shorttermstore_plugin_url = 'pb://localhost?name=STS&rootFolder=${ARCHAPPL_SHORT_TERM_FOLDER}&partitionGranularity=PARTITION_HOUR&consolidateOnShutdown=true' | 
|---|
| 58 | #longtermstore_plugin_url = 'pb://localhost?name=LTS&rootFolder=${ARCHAPPL_LONG_TERM_FOLDER}&partitionGranularity=PARTITION_YEAR' | 
|---|
| 59 | #longtermstore_plugin_url = 'blackhole://localhost' | 
|---|
| 60 |  | 
|---|
| 61 | def determinePolicy(pvInfoDict): | 
|---|
| 62 | pvPolicyDict = {} | 
|---|
| 63 |  | 
|---|
| 64 | userPolicyOverride = '' | 
|---|
| 65 | if 'policyName' in pvInfoDict: | 
|---|
| 66 | userPolicyOverride = pvInfoDict['policyName'] | 
|---|
| 67 |  | 
|---|
| 68 | # | 
|---|
| 69 | if userPolicyOverride == 'VAC' or (userPolicyOverride == '' and pvInfoDict['pvName'].startswith('MRVAC') and pvInfoDict['pvName'].startswith('PRESS')): | 
|---|
| 70 | # We reduce sampling rate for 'MRVAC:...:PRESS' records to 2sec, while these records are scanned at 1Hz. | 
|---|
| 71 | pvPolicyDict['samplingPeriod'] = 2.0 | 
|---|
| 72 | pvPolicyDict['samplingMethod'] = 'SCAN' | 
|---|
| 73 | pvPolicyDict['dataStores'] = [ | 
|---|
| 74 | shorttermstore_plugin_url, | 
|---|
| 75 | mediumtermstore_plugin_url, | 
|---|
| 76 | longtermstore_plugin_url | 
|---|
| 77 | ] | 
|---|
| 78 | pvPolicyDict['policyName'] = 'VAC'; | 
|---|
| 79 | # | 
|---|
| 80 | elif userPolicyOverride == 'test - 2HzPVs' or (userPolicyOverride == '' and pvInfoDict['eventRate'] > 2.0): | 
|---|
| 81 | pvPolicyDict['samplingPeriod'] = 1.0 | 
|---|
| 82 | pvPolicyDict['samplingMethod'] = 'MONITOR' | 
|---|
| 83 | pvPolicyDict['dataStores'] = [ | 
|---|
| 84 | shorttermstore_plugin_url, | 
|---|
| 85 | mediumtermstore_plugin_url, | 
|---|
| 86 | longtermstore_plugin_url | 
|---|
| 87 | ] | 
|---|
| 88 | pvPolicyDict['policyName'] = 'test - 2HzPVs'; | 
|---|
| 89 | # | 
|---|
| 90 | #elif userPolicyOverride == 'Default' or (userPolicyOverride == '' and pvInfoDict['pvName'] == 'mshankar:arch:sine'): | 
|---|
| 91 | elif userPolicyOverride == 'Default': | 
|---|
| 92 | pvPolicyDict['samplingPeriod'] = 1.0 | 
|---|
| 93 | pvPolicyDict['samplingMethod'] = 'MONITOR' | 
|---|
| 94 | pvPolicyDict['dataStores'] = [ | 
|---|
| 95 | shorttermstore_plugin_url, | 
|---|
| 96 | mediumtermstore_plugin_url, | 
|---|
| 97 | longtermstore_plugin_url | 
|---|
| 98 | ] | 
|---|
| 99 | pvPolicyDict['policyName'] = 'Default'; | 
|---|
| 100 | # | 
|---|
| 101 | elif userPolicyOverride == 'test - BPMS' or (userPolicyOverride == '' and pvInfoDict['pvName'].startswith('BPMS') and pvInfoDict['storageRate'] > 35): | 
|---|
| 102 | # We limit BPM PVs to 1GB/year (34 bytes/sec) | 
|---|
| 103 | # We reduce the sampling rate (and hence increase the sampling period) to cater to this. | 
|---|
| 104 | pvPolicyDict['samplingPeriod'] = pvInfoDict['storageRate']/(35*pvInfoDict['eventRate']) | 
|---|
| 105 | pvPolicyDict['samplingMethod'] = 'MONITOR' | 
|---|
| 106 | pvPolicyDict['dataStores'] = [ | 
|---|
| 107 | shorttermstore_plugin_url, | 
|---|
| 108 | mediumtermstore_plugin_url, | 
|---|
| 109 | longtermstore_plugin_url | 
|---|
| 110 | ] | 
|---|
| 111 | pvPolicyDict['policyName'] = 'test - BPMS'; | 
|---|
| 112 | # | 
|---|
| 113 | elif userPolicyOverride == 'test - 3DaysMTSOnly': | 
|---|
| 114 | pvPolicyDict['samplingPeriod'] = 1.0 | 
|---|
| 115 | pvPolicyDict['samplingMethod'] = 'MONITOR' | 
|---|
| 116 | pvPolicyDict['dataStores'] = [ | 
|---|
| 117 | shorttermstore_plugin_url, | 
|---|
| 118 | # We want to store 3 days worth of data in the MTS. | 
|---|
| 119 | 'pb://localhost?name=MTS&rootFolder=${ARCHAPPL_MEDIUM_TERM_FOLDER}&partitionGranularity=PARTITION_DAY&hold=4&gather=1', | 
|---|
| 120 | 'blackhole://localhost?name=LTS' | 
|---|
| 121 | ] | 
|---|
| 122 | pvPolicyDict['policyName'] = 'test - 2HzPVs'; | 
|---|
| 123 | # | 
|---|
| 124 | else: | 
|---|
| 125 | pvPolicyDict['samplingPeriod'] = 1.0 | 
|---|
| 126 | pvPolicyDict['samplingMethod'] = 'MONITOR' | 
|---|
| 127 | pvPolicyDict['dataStores'] = [ | 
|---|
| 128 | shorttermstore_plugin_url, | 
|---|
| 129 | mediumtermstore_plugin_url, | 
|---|
| 130 | longtermstore_plugin_url | 
|---|
| 131 | ] | 
|---|
| 132 | pvPolicyDict['policyName'] = 'Default'; | 
|---|
| 133 |  | 
|---|
| 134 | archiveFields=[] | 
|---|
| 135 |  | 
|---|
| 136 | if "RTYP" not in pvInfoDict: | 
|---|
| 137 | pvPolicyDict["archiveFields"]=archiveFields | 
|---|
| 138 | else: | 
|---|
| 139 | pvRTYP=pvInfoDict["RTYP"] | 
|---|
| 140 | if pvRTYP=="ai": | 
|---|
| 141 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR'] | 
|---|
| 142 | archiveFields=[] | 
|---|
| 143 | elif pvRTYP=="ao": | 
|---|
| 144 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR','DRVH','DRVL'] | 
|---|
| 145 | archiveFields=[] | 
|---|
| 146 | elif pvRTYP=="calc": | 
|---|
| 147 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR'] | 
|---|
| 148 | archiveFields=[] | 
|---|
| 149 | elif pvRTYP=="calcout": | 
|---|
| 150 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR'] | 
|---|
| 151 | archiveFields=[] | 
|---|
| 152 | elif pvRTYP=="longin": | 
|---|
| 153 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR'] | 
|---|
| 154 | archiveFields=[] | 
|---|
| 155 | elif pvRTYP=="longout": | 
|---|
| 156 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR','DRVH','DRVL'] | 
|---|
| 157 | archiveFields=[] | 
|---|
| 158 | elif pvRTYP=="dfanout": | 
|---|
| 159 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR'] | 
|---|
| 160 | archiveFields=[] | 
|---|
| 161 | elif pvRTYP=="sub": | 
|---|
| 162 | #archiveFields=['HIHI','HIGH','LOW','LOLO','LOPR','HOPR'] | 
|---|
| 163 | archiveFields=[] | 
|---|
| 164 | pvPolicyDict["archiveFields"]=archiveFields | 
|---|
| 165 |  | 
|---|
| 166 | return pvPolicyDict | 
|---|