epics/Archiver Appliance インストールメモ: policies.py

File policies.py, 7.9 KB (added by Shuei Yamada, 10 months ago)
Line 
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
28import sys
29import os
30
31# Generate a list of policy names. This is used to feed the dropdown in the UI.
32def 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
44def 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'
52shorttermstore_plugin_url = 'pb://localhost?name=STS&rootFolder=${ARCHAPPL_SHORT_TERM_FOLDER}&partitionGranularity=PARTITION_HOUR'
53mediumtermstore_plugin_url = 'pb://localhost?name=MTS&rootFolder=${ARCHAPPL_MEDIUM_TERM_FOLDER}&partitionGranularity=PARTITION_DAY&hold=5&gather=1'
54longtermstore_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
61def 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