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

File policies.py, 7.9 KB (added by shuei, 2 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