mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	storage: recurring volume snapshot form (#99)
This adds the recurring volume snapshot form. Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com> Co-authored-by: Rohit Yadav <rohit@apache.org>
This commit is contained in:
		
							parent
							
								
									b82957189b
								
							
						
					
					
						commit
						cc4536908a
					
				| @ -89,11 +89,12 @@ export default { | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           api: 'createSnapshotPolicy', |           api: 'createSnapshotPolicy', | ||||||
|           icon: 'video-camera', |           icon: 'clock-circle', | ||||||
|           label: 'Recurring Snapshots', |           label: 'Recurring Snapshots', | ||||||
|           dataView: true, |           dataView: true, | ||||||
|           show: (record) => { return record.state === 'Ready' }, |           show: (record) => { return record.state === 'Ready' }, | ||||||
|           args: ['volumeid', 'intervaltype', 'schedule', 'maxsnaps', 'timezone'], |           popup: true, | ||||||
|  |           component: () => import('@/views/storage/RecurringSnapshotVolume.vue'), | ||||||
|           mapping: { |           mapping: { | ||||||
|             volumeid: { |             volumeid: { | ||||||
|               value: (record) => { return record.id } |               value: (record) => { return record.id } | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ | |||||||
| "Instances": "Instances", | "Instances": "Instances", | ||||||
| "LDAP Configuration": "LDAP Configuration", | "LDAP Configuration": "LDAP Configuration", | ||||||
| "Management Servers": "Management Servers", | "Management Servers": "Management Servers", | ||||||
|  | "monday": "Monday", | ||||||
| "Monitor": "Monitor", | "Monitor": "Monitor", | ||||||
| "Network": "Network", | "Network": "Network", | ||||||
| "Network Offerings": "Network Offerings", | "Network Offerings": "Network Offerings", | ||||||
| @ -43,6 +44,8 @@ | |||||||
| "System Offerings": "System Offerings", | "System Offerings": "System Offerings", | ||||||
| "System VMs": "System VMs", | "System VMs": "System VMs", | ||||||
| "Templates": "Templates", | "Templates": "Templates", | ||||||
|  | "tuesday": "Tuesday", | ||||||
|  | "thursday": "Thursday", | ||||||
| "Users": "Users", | "Users": "Users", | ||||||
| "VM Snapshots": "VM Snapshots", | "VM Snapshots": "VM Snapshots", | ||||||
| "VPC": "VPC", | "VPC": "VPC", | ||||||
| @ -208,6 +211,7 @@ | |||||||
| "forceencap": "Force UDP Encapsulation of ESP Packets", | "forceencap": "Force UDP Encapsulation of ESP Packets", | ||||||
| "forgedTransmits": "Forged Transmits", | "forgedTransmits": "Forged Transmits", | ||||||
| "format": "Format", | "format": "Format", | ||||||
|  | "friday": "Friday", | ||||||
| "fwdevicecapacity": "Capacity", | "fwdevicecapacity": "Capacity", | ||||||
| "fwdeviceid": "ID", | "fwdeviceid": "ID", | ||||||
| "fwdevicename": "Type", | "fwdevicename": "Type", | ||||||
| @ -321,6 +325,7 @@ | |||||||
| "isstaticnat": "Static NAT", | "isstaticnat": "Static NAT", | ||||||
| "issystem": "Is System", | "issystem": "Is System", | ||||||
| "isvolatile": "Volatile", | "isvolatile": "Volatile", | ||||||
|  | "keep": "Keep", | ||||||
| "key": "Key", | "key": "Key", | ||||||
| "keyboardType": "Keyboard type", | "keyboardType": "Keyboard type", | ||||||
| "keypair": "SSH Key Pair", | "keypair": "SSH Key Pair", | ||||||
| @ -484,6 +489,8 @@ | |||||||
| "label.create.VPN.connection": "Create VPN Connection", | "label.create.VPN.connection": "Create VPN Connection", | ||||||
| "label.create.ssh.key.pair": "Create a SSH Key Pair", | "label.create.ssh.key.pair": "Create a SSH Key Pair", | ||||||
| "label.create.template": "Create template", | "label.create.template": "Create template", | ||||||
|  | "label.day.of.month": "Day of Month", | ||||||
|  | "label.day.of.week": "Day of Week", | ||||||
| "label.decline.invitation": "Decline invitation", | "label.decline.invitation": "Decline invitation", | ||||||
| "label.dedicate.cluster": "Dedicate Cluster", | "label.dedicate.cluster": "Dedicate Cluster", | ||||||
| "label.dedicate.host": "Dedicate Host", | "label.dedicate.host": "Dedicate Host", | ||||||
| @ -534,6 +541,7 @@ | |||||||
| "label.enable.vpc.offering": "Enable VPC offering", | "label.enable.vpc.offering": "Enable VPC offering", | ||||||
| "label.enable.vpn": "Enable Remote Access VPN", | "label.enable.vpn": "Enable Remote Access VPN", | ||||||
| "label.enter.token": "Enter token", | "label.enter.token": "Enter token", | ||||||
|  | "label.error.volume.upload": "Please choose a file", | ||||||
| "label.error.zone.combined": "All Zones cannot be combined with any other zone", | "label.error.zone.combined": "All Zones cannot be combined with any other zone", | ||||||
| "label.french.azerty.keyboard": "French AZERTY keyboard", | "label.french.azerty.keyboard": "French AZERTY keyboard", | ||||||
| "label.globo.dns.configuration": "GloboDNS Configuration", | "label.globo.dns.configuration": "GloboDNS Configuration", | ||||||
| @ -543,11 +551,18 @@ | |||||||
| "label.ha.configure": "Configure HA", | "label.ha.configure": "Configure HA", | ||||||
| "label.ha.disable": "Disable HA", | "label.ha.disable": "Disable HA", | ||||||
| "label.ha.enable": "Enable HA", | "label.ha.enable": "Enable HA", | ||||||
|  | "label.scheduled.snapshots": "Scheduled Snapshots", | ||||||
|  | "label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference", | ||||||
|  | "label.header.volume.take.snapshot": "Please confirm that you want to take a snapshot of this volume.", | ||||||
| "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade", | "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade", | ||||||
|  | "label.interval.weekly": "Every {number}", | ||||||
|  | "label.interval.monthly": "Day {number} of month", | ||||||
| "label.japanese.keyboard": "Japanese keyboard", | "label.japanese.keyboard": "Japanese keyboard", | ||||||
| "label.link.domain.to.ldap": "Link Domain to LDAP", | "label.link.domain.to.ldap": "Link Domain to LDAP", | ||||||
| "label.make.project.owner": "Make account project owner", | "label.make.project.owner": "Make account project owner", | ||||||
| "label.metrics": "Metrics", | "label.metrics": "Metrics", | ||||||
|  | "label.min.past.hour": "min past the hr", | ||||||
|  | "label.minute.past.hour": "minute(s) past the hour", | ||||||
| "label.migrate.instance.to.host": "Migrate instance to another host", | "label.migrate.instance.to.host": "Migrate instance to another host", | ||||||
| "label.migrate.instance.to.ps": "Migrate instance to another primary storage", | "label.migrate.instance.to.ps": "Migrate instance to another primary storage", | ||||||
| "label.migrate.lb.vm": "Migrate LB VM", | "label.migrate.lb.vm": "Migrate LB VM", | ||||||
| @ -555,6 +570,7 @@ | |||||||
| "label.migrate.volume.to.primary.storage": "Migrate volume to another primary storage", | "label.migrate.volume.to.primary.storage": "Migrate volume to another primary storage", | ||||||
| "label.ncc.delete": "Delete NCC", | "label.ncc.delete": "Delete NCC", | ||||||
| "label.network.addVM": "Add network to VM", | "label.network.addVM": "Add network to VM", | ||||||
|  | "label.new.tag": "New Tag", | ||||||
| "label.new.project": "New Project", | "label.new.project": "New Project", | ||||||
| "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action", | "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action", | ||||||
| "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password", | "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password", | ||||||
| @ -816,6 +832,8 @@ | |||||||
| "routerType": "Type", | "routerType": "Type", | ||||||
| "samlEnable": "Authorize SAML SSO", | "samlEnable": "Authorize SAML SSO", | ||||||
| "samlEntity": "Identity Provider", | "samlEntity": "Identity Provider", | ||||||
|  | "saturday": "Saturday", | ||||||
|  | "schedule": "Schedule", | ||||||
| "scope": "Scope", | "scope": "Scope", | ||||||
| "secondaryStorageLimit": "Secondary Storage limits (GiB)", | "secondaryStorageLimit": "Secondary Storage limits (GiB)", | ||||||
| "secondaryips": "Secondary IPs", | "secondaryips": "Secondary IPs", | ||||||
| @ -879,6 +897,7 @@ | |||||||
| "storagetype": "Storage Type", | "storagetype": "Storage Type", | ||||||
| "subdomainaccess": "Subdomain Access", | "subdomainaccess": "Subdomain Access", | ||||||
| "submit": "Submit", | "submit": "Submit", | ||||||
|  | "sunday": "Sunday", | ||||||
| "supportedServices": "Supported Services", | "supportedServices": "Supported Services", | ||||||
| "supportspublicaccess": "Supports Public Access", | "supportspublicaccess": "Supports Public Access", | ||||||
| "supportsregionLevelvpc": "Supports Region Level VPC", | "supportsregionLevelvpc": "Supports Region Level VPC", | ||||||
| @ -899,6 +918,7 @@ | |||||||
| "tftpdir": "Tftp root directory", | "tftpdir": "Tftp root directory", | ||||||
| "threshold": "Threshold", | "threshold": "Threshold", | ||||||
| "tierName": "Tier", | "tierName": "Tier", | ||||||
|  | "time": "Time", | ||||||
| "timeout": "Timeout", | "timeout": "Timeout", | ||||||
| "timezone": "Timezone", | "timezone": "Timezone", | ||||||
| "token": "Token", | "token": "Token", | ||||||
| @ -956,6 +976,7 @@ | |||||||
| "vmwaredcVcenter": "VMware datacenter vcenter", | "vmwaredcVcenter": "VMware datacenter vcenter", | ||||||
| "vmwarenetworklabel": "VMware traffic label", | "vmwarenetworklabel": "VMware traffic label", | ||||||
| "volume": "Volume", | "volume": "Volume", | ||||||
|  | "volumeChecksum": "MD5 checksum", | ||||||
| "volumeFileUpload": "Local file", | "volumeFileUpload": "Local file", | ||||||
| "volumeLimit": "Volume Limits", | "volumeLimit": "Volume Limits", | ||||||
| "volumeTotal": "Volumes", | "volumeTotal": "Volumes", | ||||||
| @ -964,6 +985,7 @@ | |||||||
| "volumename": "Volume Name", | "volumename": "Volume Name", | ||||||
| "volumes": "Volumes to be deleted", | "volumes": "Volumes to be deleted", | ||||||
| "volumetotal": "Volume", | "volumetotal": "Volume", | ||||||
|  | "volume.volumeFileUpload.description": "Click or drag file to this area to upload", | ||||||
| "vpcLimit": "VPC limits", | "vpcLimit": "VPC limits", | ||||||
| "vpcid": "VPC", | "vpcid": "VPC", | ||||||
| "vpcname": "VPC", | "vpcname": "VPC", | ||||||
| @ -998,5 +1020,6 @@ | |||||||
| "yourInstance": "Your instance", | "yourInstance": "Your instance", | ||||||
| "newInstance": "New instance", | "newInstance": "New instance", | ||||||
| "cpu": "CPU", | "cpu": "CPU", | ||||||
| "ram": "RAM" | "ram": "RAM", | ||||||
|  | "wednesday": "Wednesday" | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										80
									
								
								ui/src/utils/timezone/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								ui/src/utils/timezone/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | |||||||
|  | // Licensed to the Apache Software Foundation (ASF) under one
 | ||||||
|  | // or more contributor license agreements.  See the NOTICE file
 | ||||||
|  | // distributed with this work for additional information
 | ||||||
|  | // regarding copyright ownership.  The ASF licenses this file
 | ||||||
|  | // to you under the Apache License, Version 2.0 (the
 | ||||||
|  | // "License"); you may not use this file except in compliance
 | ||||||
|  | // with the License.  You may obtain a copy of the License at
 | ||||||
|  | //
 | ||||||
|  | //   http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | //
 | ||||||
|  | // Unless required by applicable law or agreed to in writing,
 | ||||||
|  | // software distributed under the License is distributed on an
 | ||||||
|  | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 | ||||||
|  | // KIND, either express or implied.  See the License for the
 | ||||||
|  | // specific language governing permissions and limitations
 | ||||||
|  | // under the License.
 | ||||||
|  | 
 | ||||||
|  | function loadTimeZone () { | ||||||
|  |   const timeZoneJson = require.context('./', true, /[A-Za-z0-9-_,\s]+\.json$/i) | ||||||
|  |   const data = [] | ||||||
|  | 
 | ||||||
|  |   timeZoneJson.keys().forEach(key => { | ||||||
|  |     const matched = key.match(/([A-Za-z0-9-_]+)\./i) | ||||||
|  |     if (matched && matched.length > 1) { | ||||||
|  |       const json = timeZoneJson(key) | ||||||
|  |       for (const index in json) { | ||||||
|  |         data.push({ | ||||||
|  |           id: index, | ||||||
|  |           name: json[index] | ||||||
|  |         }) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | 
 | ||||||
|  |   return data | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function getFullTimeZone (strQuery) { | ||||||
|  |   if (!strQuery || strQuery === '') { | ||||||
|  |     return [] | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const timeZoneJson = require.context('./', true, /[A-Za-z0-9-_,\s]+\.json$/i) | ||||||
|  |   const data = [] | ||||||
|  |   timeZoneJson.keys().forEach(key => { | ||||||
|  |     const matched = key.match(/([A-Za-z0-9-_]+)\./i) | ||||||
|  |     if (matched && matched.length > 1) { | ||||||
|  |       const json = timeZoneJson(key) | ||||||
|  |       for (const index in json) { | ||||||
|  |         if (index.toLowerCase() === strQuery.toLowerCase()) { | ||||||
|  |           data.push({ | ||||||
|  |             id: index, | ||||||
|  |             name: json[index] | ||||||
|  |           }) | ||||||
|  | 
 | ||||||
|  |           break | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | 
 | ||||||
|  |   return data | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function timeZone () { | ||||||
|  |   return new Promise(resolve => { | ||||||
|  |     const dataTimeZone = loadTimeZone() | ||||||
|  |     resolve(dataTimeZone) | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function timeZoneName (key) { | ||||||
|  |   const dataTimeZone = getFullTimeZone(key) | ||||||
|  | 
 | ||||||
|  |   if (dataTimeZone && dataTimeZone[0]) { | ||||||
|  |     return dataTimeZone[0].name | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return '' | ||||||
|  | } | ||||||
							
								
								
									
										620
									
								
								ui/src/utils/timezone/timezone.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										620
									
								
								ui/src/utils/timezone/timezone.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,620 @@ | |||||||
|  | { | ||||||
|  |   "ACT": "ACT [Central Standard Time (Northern Territory)]", | ||||||
|  |   "AET": "AET [Eastern Standard Time (New South Wales)]", | ||||||
|  |   "AGT": "AGT [Argentine Time]", | ||||||
|  |   "ART": "ART [Eastern European Time]", | ||||||
|  |   "AST": "AST [Alaska Standard Time]", | ||||||
|  |   "Africa/Abidjan": "Africa/Abidjan [Greenwich Mean Time]", | ||||||
|  |   "Africa/Accra": "Africa/Accra [Ghana Mean Time]", | ||||||
|  |   "Africa/Addis_Ababa": "Africa/Addis_Ababa [Eastern African Time]", | ||||||
|  |   "Africa/Algiers": "Africa/Algiers [Central European Time]", | ||||||
|  |   "Africa/Asmara": "Africa/Asmara [Eastern African Time]", | ||||||
|  |   "Africa/Asmera": "Africa/Asmera [Eastern African Time]", | ||||||
|  |   "Africa/Bamako": "Africa/Bamako [Greenwich Mean Time]", | ||||||
|  |   "Africa/Bangui": "Africa/Bangui [Western African Time]", | ||||||
|  |   "Africa/Banjul": "Africa/Banjul [Greenwich Mean Time]", | ||||||
|  |   "Africa/Bissau": "Africa/Bissau [Greenwich Mean Time]", | ||||||
|  |   "Africa/Blantyre": "Africa/Blantyre [Central African Time]", | ||||||
|  |   "Africa/Brazzaville": "Africa/Brazzaville [Western African Time]", | ||||||
|  |   "Africa/Bujumbura": "Africa/Bujumbura [Central African Time]", | ||||||
|  |   "Africa/Cairo": "Africa/Cairo [Eastern European Time]", | ||||||
|  |   "Africa/Casablanca": "Africa/Casablanca [Western European Time]", | ||||||
|  |   "Africa/Ceuta": "Africa/Ceuta [Central European Time]", | ||||||
|  |   "Africa/Conakry": "Africa/Conakry [Greenwich Mean Time]", | ||||||
|  |   "Africa/Dakar": "Africa/Dakar [Greenwich Mean Time]", | ||||||
|  |   "Africa/Dar_es_Salaam": "Africa/Dar_es_Salaam [Eastern African Time]", | ||||||
|  |   "Africa/Djibouti": "Africa/Djibouti [Eastern African Time]", | ||||||
|  |   "Africa/Douala": "Africa/Douala [Western African Time]", | ||||||
|  |   "Africa/El_Aaiun": "Africa/El_Aaiun [Western European Time]", | ||||||
|  |   "Africa/Freetown": "Africa/Freetown [Greenwich Mean Time]", | ||||||
|  |   "Africa/Gaborone": "Africa/Gaborone [Central African Time]", | ||||||
|  |   "Africa/Harare": "Africa/Harare [Central African Time]", | ||||||
|  |   "Africa/Johannesburg": "Africa/Johannesburg [South Africa Standard Time]", | ||||||
|  |   "Africa/Juba": "Africa/Juba [GMT+03:00]", | ||||||
|  |   "Africa/Kampala": "Africa/Kampala [Eastern African Time]", | ||||||
|  |   "Africa/Khartoum": "Africa/Khartoum [Eastern African Time]", | ||||||
|  |   "Africa/Kigali": "Africa/Kigali [Central African Time]", | ||||||
|  |   "Africa/Kinshasa": "Africa/Kinshasa [Western African Time]", | ||||||
|  |   "Africa/Lagos": "Africa/Lagos [Western African Time]", | ||||||
|  |   "Africa/Libreville": "Africa/Libreville [Western African Time]", | ||||||
|  |   "Africa/Lome": "Africa/Lome [Greenwich Mean Time]", | ||||||
|  |   "Africa/Luanda": "Africa/Luanda [Western African Time]", | ||||||
|  |   "Africa/Lubumbashi": "Africa/Lubumbashi [Central African Time]", | ||||||
|  |   "Africa/Lusaka": "Africa/Lusaka [Central African Time]", | ||||||
|  |   "Africa/Malabo": "Africa/Malabo [Western African Time]", | ||||||
|  |   "Africa/Maputo": "Africa/Maputo [Central African Time]", | ||||||
|  |   "Africa/Maseru": "Africa/Maseru [South Africa Standard Time]", | ||||||
|  |   "Africa/Mbabane": "Africa/Mbabane [South Africa Standard Time]", | ||||||
|  |   "Africa/Mogadishu": "Africa/Mogadishu [Eastern African Time]", | ||||||
|  |   "Africa/Monrovia": "Africa/Monrovia [Greenwich Mean Time]", | ||||||
|  |   "Africa/Nairobi": "Africa/Nairobi [Eastern African Time]", | ||||||
|  |   "Africa/Ndjamena": "Africa/Ndjamena [Western African Time]", | ||||||
|  |   "Africa/Niamey": "Africa/Niamey [Western African Time]", | ||||||
|  |   "Africa/Nouakchott": "Africa/Nouakchott [Greenwich Mean Time]", | ||||||
|  |   "Africa/Ouagadougou": "Africa/Ouagadougou [Greenwich Mean Time]", | ||||||
|  |   "Africa/Porto-Novo": "Africa/Porto-Novo [Western African Time]", | ||||||
|  |   "Africa/Sao_Tome": "Africa/Sao_Tome [Greenwich Mean Time]", | ||||||
|  |   "Africa/Timbuktu": "Africa/Timbuktu [Greenwich Mean Time]", | ||||||
|  |   "Africa/Tripoli": "Africa/Tripoli [Eastern European Time]", | ||||||
|  |   "Africa/Tunis": "Africa/Tunis [Central European Time]", | ||||||
|  |   "Africa/Windhoek": "Africa/Windhoek [Western African Time]", | ||||||
|  |   "America/Adak": "America/Adak [Hawaii-Aleutian Standard Time]", | ||||||
|  |   "America/Anchorage": "America/Anchorage [Alaska Standard Time]", | ||||||
|  |   "America/Anguilla": "America/Anguilla [Atlantic Standard Time]", | ||||||
|  |   "America/Antigua": "America/Antigua [Atlantic Standard Time]", | ||||||
|  |   "America/Araguaina": "America/Araguaina [Brasilia Time]", | ||||||
|  |   "America/Argentina/Buenos_Aires": "America/Argentina/Buenos_Aires [Argentine Time]", | ||||||
|  |   "America/Argentina/Catamarca": "America/Argentina/Catamarca [Argentine Time]", | ||||||
|  |   "America/Argentina/ComodRivadavia": "America/Argentina/ComodRivadavia [Argentine Time]", | ||||||
|  |   "America/Argentina/Cordoba": "America/Argentina/Cordoba [Argentine Time]", | ||||||
|  |   "America/Argentina/Jujuy": "America/Argentina/Jujuy [Argentine Time]", | ||||||
|  |   "America/Argentina/La_Rioja": "America/Argentina/La_Rioja [Argentine Time]", | ||||||
|  |   "America/Argentina/Mendoza": "America/Argentina/Mendoza [Argentine Time]", | ||||||
|  |   "America/Argentina/Rio_Gallegos": "America/Argentina/Rio_Gallegos [Argentine Time]", | ||||||
|  |   "America/Argentina/Salta": "America/Argentina/Salta [Argentine Time]", | ||||||
|  |   "America/Argentina/San_Juan": "America/Argentina/San_Juan [Argentine Time]", | ||||||
|  |   "America/Argentina/San_Luis": "America/Argentina/San_Luis [Western Argentine Time]", | ||||||
|  |   "America/Argentina/Tucuman": "America/Argentina/Tucuman [Argentine Time]", | ||||||
|  |   "America/Argentina/Ushuaia": "America/Argentina/Ushuaia [Argentine Time]", | ||||||
|  |   "America/Aruba": "America/Aruba [Atlantic Standard Time]", | ||||||
|  |   "America/Asuncion": "America/Asuncion [Paraguay Time]", | ||||||
|  |   "America/Atikokan": "America/Atikokan [Eastern Standard Time]", | ||||||
|  |   "America/Atka": "America/Atka [Hawaii-Aleutian Standard Time]", | ||||||
|  |   "America/Bahia": "America/Bahia [Brasilia Time]", | ||||||
|  |   "America/Bahia_Banderas": "America/Bahia_Banderas [GMT-06:00]", | ||||||
|  |   "America/Barbados": "America/Barbados [Atlantic Standard Time]", | ||||||
|  |   "America/Belem": "America/Belem [Brasilia Time]", | ||||||
|  |   "America/Belize": "America/Belize [Central Standard Time]", | ||||||
|  |   "America/Blanc-Sablon": "America/Blanc-Sablon [Atlantic Standard Time]", | ||||||
|  |   "America/Boa_Vista": "America/Boa_Vista [Amazon Time]", | ||||||
|  |   "America/Bogota": "America/Bogota [Colombia Time]", | ||||||
|  |   "America/Boise": "America/Boise [Mountain Standard Time]", | ||||||
|  |   "America/Buenos_Aires": "America/Buenos_Aires [Argentine Time]", | ||||||
|  |   "America/Cambridge_Bay": "America/Cambridge_Bay [Mountain Standard Time]", | ||||||
|  |   "America/Campo_Grande": "America/Campo_Grande [Amazon Time]", | ||||||
|  |   "America/Cancun": "America/Cancun [Central Standard Time]", | ||||||
|  |   "America/Caracas": "America/Caracas [Venezuela Time]", | ||||||
|  |   "America/Catamarca": "America/Catamarca [Argentine Time]", | ||||||
|  |   "America/Cayenne": "America/Cayenne [French Guiana Time]", | ||||||
|  |   "America/Cayman": "America/Cayman [Eastern Standard Time]", | ||||||
|  |   "America/Chicago": "America/Chicago [Central Standard Time]", | ||||||
|  |   "America/Chihuahua": "America/Chihuahua [Mountain Standard Time]", | ||||||
|  |   "America/Coral_Harbour": "America/Coral_Harbour [Eastern Standard Time]", | ||||||
|  |   "America/Cordoba": "America/Cordoba [Argentine Time]", | ||||||
|  |   "America/Costa_Rica": "America/Costa_Rica [Central Standard Time]", | ||||||
|  |   "America/Creston": "America/Creston [GMT-07:00]", | ||||||
|  |   "America/Cuiaba": "America/Cuiaba [Amazon Time]", | ||||||
|  |   "America/Curacao": "America/Curacao [Atlantic Standard Time]", | ||||||
|  |   "America/Danmarkshavn": "America/Danmarkshavn [Greenwich Mean Time]", | ||||||
|  |   "America/Dawson": "America/Dawson [Pacific Standard Time]", | ||||||
|  |   "America/Dawson_Creek": "America/Dawson_Creek [Mountain Standard Time]", | ||||||
|  |   "America/Denver": "America/Denver [Mountain Standard Time]", | ||||||
|  |   "America/Detroit": "America/Detroit [Eastern Standard Time]", | ||||||
|  |   "America/Dominica": "America/Dominica [Atlantic Standard Time]", | ||||||
|  |   "America/Edmonton": "America/Edmonton [Mountain Standard Time]", | ||||||
|  |   "America/Eirunepe": "America/Eirunepe [Amazon Time]", | ||||||
|  |   "America/El_Salvador": "America/El_Salvador [Central Standard Time]", | ||||||
|  |   "America/Ensenada": "America/Ensenada [Pacific Standard Time]", | ||||||
|  |   "America/Fort_Wayne": "America/Fort_Wayne [Eastern Standard Time]", | ||||||
|  |   "America/Fortaleza": "America/Fortaleza [Brasilia Time]", | ||||||
|  |   "America/Glace_Bay": "America/Glace_Bay [Atlantic Standard Time]", | ||||||
|  |   "America/Godthab": "America/Godthab [Western Greenland Time]", | ||||||
|  |   "America/Goose_Bay": "America/Goose_Bay [Atlantic Standard Time]", | ||||||
|  |   "America/Grand_Turk": "America/Grand_Turk [Eastern Standard Time]", | ||||||
|  |   "America/Grenada": "America/Grenada [Atlantic Standard Time]", | ||||||
|  |   "America/Guadeloupe": "America/Guadeloupe [Atlantic Standard Time]", | ||||||
|  |   "America/Guatemala": "America/Guatemala [Central Standard Time]", | ||||||
|  |   "America/Guayaquil": "America/Guayaquil [Ecuador Time]", | ||||||
|  |   "America/Guyana": "America/Guyana [Guyana Time]", | ||||||
|  |   "America/Halifax": "America/Halifax [Atlantic Standard Time]", | ||||||
|  |   "America/Havana": "America/Havana [Cuba Standard Time]", | ||||||
|  |   "America/Hermosillo": "America/Hermosillo [Mountain Standard Time]", | ||||||
|  |   "America/Indiana/Indianapolis": "America/Indiana/Indianapolis [Eastern Standard Time]", | ||||||
|  |   "America/Indiana/Knox": "America/Indiana/Knox [Central Standard Time]", | ||||||
|  |   "America/Indiana/Marengo": "America/Indiana/Marengo [Eastern Standard Time]", | ||||||
|  |   "America/Indiana/Petersburg": "America/Indiana/Petersburg [Eastern Standard Time]", | ||||||
|  |   "America/Indiana/Tell_City": "America/Indiana/Tell_City [Central Standard Time]", | ||||||
|  |   "America/Indiana/Vevay": "America/Indiana/Vevay [Eastern Standard Time]", | ||||||
|  |   "America/Indiana/Vincennes": "America/Indiana/Vincennes [Eastern Standard Time]", | ||||||
|  |   "America/Indiana/Winamac": "America/Indiana/Winamac [Eastern Standard Time]", | ||||||
|  |   "America/Indianapolis": "America/Indianapolis [Eastern Standard Time]", | ||||||
|  |   "America/Inuvik": "America/Inuvik [Mountain Standard Time]", | ||||||
|  |   "America/Iqaluit": "America/Iqaluit [Eastern Standard Time]", | ||||||
|  |   "America/Jamaica": "America/Jamaica [Eastern Standard Time]", | ||||||
|  |   "America/Jujuy": "America/Jujuy [Argentine Time]", | ||||||
|  |   "America/Juneau": "America/Juneau [Alaska Standard Time]", | ||||||
|  |   "America/Kentucky/Louisville": "America/Kentucky/Louisville [Eastern Standard Time]", | ||||||
|  |   "America/Kentucky/Monticello": "America/Kentucky/Monticello [Eastern Standard Time]", | ||||||
|  |   "America/Knox_IN": "America/Knox_IN [Central Standard Time]", | ||||||
|  |   "America/Kralendijk": "America/Kralendijk [GMT-04:00]", | ||||||
|  |   "America/La_Paz": "America/La_Paz [Bolivia Time]", | ||||||
|  |   "America/Lima": "America/Lima [Peru Time]", | ||||||
|  |   "America/Los_Angeles": "America/Los_Angeles [Pacific Standard Time]", | ||||||
|  |   "America/Louisville": "America/Louisville [Eastern Standard Time]", | ||||||
|  |   "America/Lower_Princes": "America/Lower_Princes [GMT-04:00]", | ||||||
|  |   "America/Maceio": "America/Maceio [Brasilia Time]", | ||||||
|  |   "America/Managua": "America/Managua [Central Standard Time]", | ||||||
|  |   "America/Manaus": "America/Manaus [Amazon Time]", | ||||||
|  |   "America/Marigot": "America/Marigot [Atlantic Standard Time]", | ||||||
|  |   "America/Martinique": "America/Martinique [Atlantic Standard Time]", | ||||||
|  |   "America/Matamoros": "America/Matamoros [Central Standard Time]", | ||||||
|  |   "America/Mazatlan": "America/Mazatlan [Mountain Standard Time]", | ||||||
|  |   "America/Mendoza": "America/Mendoza [Argentine Time]", | ||||||
|  |   "America/Menominee": "America/Menominee [Central Standard Time]", | ||||||
|  |   "America/Merida": "America/Merida [Central Standard Time]", | ||||||
|  |   "America/Metlakatla": "America/Metlakatla [GMT-08:00]", | ||||||
|  |   "America/Mexico_City": "America/Mexico_City [Central Standard Time]", | ||||||
|  |   "America/Miquelon": "America/Miquelon [Pierre & Miquelon Standard Time]", | ||||||
|  |   "America/Moncton": "America/Moncton [Atlantic Standard Time]", | ||||||
|  |   "America/Monterrey": "America/Monterrey [Central Standard Time]", | ||||||
|  |   "America/Montevideo": "America/Montevideo [Uruguay Time]", | ||||||
|  |   "America/Montreal": "America/Montreal [Eastern Standard Time]", | ||||||
|  |   "America/Montserrat": "America/Montserrat [Atlantic Standard Time]", | ||||||
|  |   "America/Nassau": "America/Nassau [Eastern Standard Time]", | ||||||
|  |   "America/New_York": "America/New_York [Eastern Standard Time]", | ||||||
|  |   "America/Nipigon": "America/Nipigon [Eastern Standard Time]", | ||||||
|  |   "America/Nome": "America/Nome [Alaska Standard Time]", | ||||||
|  |   "America/Noronha": "America/Noronha [Fernando de Noronha Time]", | ||||||
|  |   "America/North_Dakota/Beulah": "America/North_Dakota/Beulah [GMT-06:00]", | ||||||
|  |   "America/North_Dakota/Center": "America/North_Dakota/Center [Central Standard Time]", | ||||||
|  |   "America/North_Dakota/New_Salem": "America/North_Dakota/New_Salem [Central Standard Time]", | ||||||
|  |   "America/Ojinaga": "America/Ojinaga [Mountain Standard Time]", | ||||||
|  |   "America/Panama": "America/Panama [Eastern Standard Time]", | ||||||
|  |   "America/Pangnirtung": "America/Pangnirtung [Eastern Standard Time]", | ||||||
|  |   "America/Paramaribo": "America/Paramaribo [Suriname Time]", | ||||||
|  |   "America/Phoenix": "America/Phoenix [Mountain Standard Time]", | ||||||
|  |   "America/Port-au-Prince": "America/Port-au-Prince [Eastern Standard Time]", | ||||||
|  |   "America/Port_of_Spain": "America/Port_of_Spain [Atlantic Standard Time]", | ||||||
|  |   "America/Porto_Acre": "America/Porto_Acre [Amazon Time]", | ||||||
|  |   "America/Porto_Velho": "America/Porto_Velho [Amazon Time]", | ||||||
|  |   "America/Puerto_Rico": "America/Puerto_Rico [Atlantic Standard Time]", | ||||||
|  |   "America/Rainy_River": "America/Rainy_River [Central Standard Time]", | ||||||
|  |   "America/Rankin_Inlet": "America/Rankin_Inlet [Central Standard Time]", | ||||||
|  |   "America/Recife": "America/Recife [Brasilia Time]", | ||||||
|  |   "America/Regina": "America/Regina [Central Standard Time]", | ||||||
|  |   "America/Resolute": "America/Resolute [Eastern Standard Time]", | ||||||
|  |   "America/Rio_Branco": "America/Rio_Branco [Amazon Time]", | ||||||
|  |   "America/Rosario": "America/Rosario [Argentine Time]", | ||||||
|  |   "America/Santa_Isabel": "America/Santa_Isabel [Pacific Standard Time]", | ||||||
|  |   "America/Santarem": "America/Santarem [Brasilia Time]", | ||||||
|  |   "America/Santiago": "America/Santiago [Chile Time]", | ||||||
|  |   "America/Santo_Domingo": "America/Santo_Domingo [Atlantic Standard Time]", | ||||||
|  |   "America/Sao_Paulo": "America/Sao_Paulo [Brasilia Time]", | ||||||
|  |   "America/Scoresbysund": "America/Scoresbysund [Eastern Greenland Time]", | ||||||
|  |   "America/Shiprock": "America/Shiprock [Mountain Standard Time]", | ||||||
|  |   "America/Sitka": "America/Sitka [GMT-09:00]", | ||||||
|  |   "America/St_Barthelemy": "America/St_Barthelemy [Atlantic Standard Time]", | ||||||
|  |   "America/St_Johns": "America/St_Johns [Newfoundland Standard Time]", | ||||||
|  |   "America/St_Kitts": "America/St_Kitts [Atlantic Standard Time]", | ||||||
|  |   "America/St_Lucia": "America/St_Lucia [Atlantic Standard Time]", | ||||||
|  |   "America/St_Thomas": "America/St_Thomas [Atlantic Standard Time]", | ||||||
|  |   "America/St_Vincent": "America/St_Vincent [Atlantic Standard Time]", | ||||||
|  |   "America/Swift_Current": "America/Swift_Current [Central Standard Time]", | ||||||
|  |   "America/Tegucigalpa": "America/Tegucigalpa [Central Standard Time]", | ||||||
|  |   "America/Thule": "America/Thule [Atlantic Standard Time]", | ||||||
|  |   "America/Thunder_Bay": "America/Thunder_Bay [Eastern Standard Time]", | ||||||
|  |   "America/Tijuana": "America/Tijuana [Pacific Standard Time]", | ||||||
|  |   "America/Toronto": "America/Toronto [Eastern Standard Time]", | ||||||
|  |   "America/Tortola": "America/Tortola [Atlantic Standard Time]", | ||||||
|  |   "America/Vancouver": "America/Vancouver [Pacific Standard Time]", | ||||||
|  |   "America/Virgin": "America/Virgin [Atlantic Standard Time]", | ||||||
|  |   "America/Whitehorse": "America/Whitehorse [Pacific Standard Time]", | ||||||
|  |   "America/Winnipeg": "America/Winnipeg [Central Standard Time]", | ||||||
|  |   "America/Yakutat": "America/Yakutat [Alaska Standard Time]", | ||||||
|  |   "America/Yellowknife": "America/Yellowknife [Mountain Standard Time]", | ||||||
|  |   "Antarctica/Casey": "Antarctica/Casey [Western Standard Time (Australia)]", | ||||||
|  |   "Antarctica/Davis": "Antarctica/Davis [Davis Time]", | ||||||
|  |   "Antarctica/DumontDUrville": "Antarctica/DumontDUrville [Dumont-d'Urville Time]", | ||||||
|  |   "Antarctica/Macquarie": "Antarctica/Macquarie [Macquarie Island Time]", | ||||||
|  |   "Antarctica/Mawson": "Antarctica/Mawson [Mawson Time]", | ||||||
|  |   "Antarctica/McMurdo": "Antarctica/McMurdo [New Zealand Standard Time]", | ||||||
|  |   "Antarctica/Palmer": "Antarctica/Palmer [Chile Time]", | ||||||
|  |   "Antarctica/Rothera": "Antarctica/Rothera [Rothera Time]", | ||||||
|  |   "Antarctica/South_Pole": "Antarctica/South_Pole [New Zealand Standard Time]", | ||||||
|  |   "Antarctica/Syowa": "Antarctica/Syowa [Syowa Time]", | ||||||
|  |   "Antarctica/Vostok": "Antarctica/Vostok [Vostok Time]", | ||||||
|  |   "Arctic/Longyearbyen": "Arctic/Longyearbyen [Central European Time]", | ||||||
|  |   "Asia/Aden": "Asia/Aden [Arabia Standard Time]", | ||||||
|  |   "Asia/Almaty": "Asia/Almaty [Alma-Ata Time]", | ||||||
|  |   "Asia/Amman": "Asia/Amman [Eastern European Time]", | ||||||
|  |   "Asia/Anadyr": "Asia/Anadyr [Anadyr Time]", | ||||||
|  |   "Asia/Aqtau": "Asia/Aqtau [Aqtau Time]", | ||||||
|  |   "Asia/Aqtobe": "Asia/Aqtobe [Aqtobe Time]", | ||||||
|  |   "Asia/Ashgabat": "Asia/Ashgabat [Turkmenistan Time]", | ||||||
|  |   "Asia/Ashkhabad": "Asia/Ashkhabad [Turkmenistan Time]", | ||||||
|  |   "Asia/Baghdad": "Asia/Baghdad [Arabia Standard Time]", | ||||||
|  |   "Asia/Bahrain": "Asia/Bahrain [Arabia Standard Time]", | ||||||
|  |   "Asia/Baku": "Asia/Baku [Azerbaijan Time]", | ||||||
|  |   "Asia/Bangkok": "Asia/Bangkok [Indochina Time]", | ||||||
|  |   "Asia/Beirut": "Asia/Beirut [Eastern European Time]", | ||||||
|  |   "Asia/Bishkek": "Asia/Bishkek [Kirgizstan Time]", | ||||||
|  |   "Asia/Brunei": "Asia/Brunei [Brunei Time]", | ||||||
|  |   "Asia/Calcutta": "Asia/Calcutta [India Standard Time]", | ||||||
|  |   "Asia/Choibalsan": "Asia/Choibalsan [Choibalsan Time]", | ||||||
|  |   "Asia/Chongqing": "Asia/Chongqing [China Standard Time]", | ||||||
|  |   "Asia/Chungking": "Asia/Chungking [China Standard Time]", | ||||||
|  |   "Asia/Colombo": "Asia/Colombo [India Standard Time]", | ||||||
|  |   "Asia/Dacca": "Asia/Dacca [Bangladesh Time]", | ||||||
|  |   "Asia/Damascus": "Asia/Damascus [Eastern European Time]", | ||||||
|  |   "Asia/Dhaka": "Asia/Dhaka [Bangladesh Time]", | ||||||
|  |   "Asia/Dili": "Asia/Dili [Timor-Leste Time]", | ||||||
|  |   "Asia/Dubai": "Asia/Dubai [Gulf Standard Time]", | ||||||
|  |   "Asia/Dushanbe": "Asia/Dushanbe [Tajikistan Time]", | ||||||
|  |   "Asia/Gaza": "Asia/Gaza [Eastern European Time]", | ||||||
|  |   "Asia/Harbin": "Asia/Harbin [China Standard Time]", | ||||||
|  |   "Asia/Hebron": "Asia/Hebron [GMT+02:00]", | ||||||
|  |   "Asia/Ho_Chi_Minh": "Asia/Ho_Chi_Minh [Indochina Time]", | ||||||
|  |   "Asia/Hong_Kong": "Asia/Hong_Kong [Hong Kong Time]", | ||||||
|  |   "Asia/Hovd": "Asia/Hovd [Hovd Time]", | ||||||
|  |   "Asia/Irkutsk": "Asia/Irkutsk [Irkutsk Time]", | ||||||
|  |   "Asia/Istanbul": "Asia/Istanbul [Eastern European Time]", | ||||||
|  |   "Asia/Jakarta": "Asia/Jakarta [West Indonesia Time]", | ||||||
|  |   "Asia/Jayapura": "Asia/Jayapura [East Indonesia Time]", | ||||||
|  |   "Asia/Jerusalem": "Asia/Jerusalem [Israel Standard Time]", | ||||||
|  |   "Asia/Kabul": "Asia/Kabul [Afghanistan Time]", | ||||||
|  |   "Asia/Kamchatka": "Asia/Kamchatka [Petropavlovsk-Kamchatski Time]", | ||||||
|  |   "Asia/Karachi": "Asia/Karachi [Pakistan Time]", | ||||||
|  |   "Asia/Kashgar": "Asia/Kashgar [China Standard Time]", | ||||||
|  |   "Asia/Kathmandu": "Asia/Kathmandu [Nepal Time]", | ||||||
|  |   "Asia/Katmandu": "Asia/Katmandu [Nepal Time]", | ||||||
|  |   "Asia/Khandyga": "Asia/Khandyga [GMT+10:00]", | ||||||
|  |   "Asia/Kolkata": "Asia/Kolkata [India Standard Time]", | ||||||
|  |   "Asia/Krasnoyarsk": "Asia/Krasnoyarsk [Krasnoyarsk Time]", | ||||||
|  |   "Asia/Kuala_Lumpur": "Asia/Kuala_Lumpur [Malaysia Time]", | ||||||
|  |   "Asia/Kuching": "Asia/Kuching [Malaysia Time]", | ||||||
|  |   "Asia/Kuwait": "Asia/Kuwait [Arabia Standard Time]", | ||||||
|  |   "Asia/Macao": "Asia/Macao [China Standard Time]", | ||||||
|  |   "Asia/Macau": "Asia/Macau [China Standard Time]", | ||||||
|  |   "Asia/Magadan": "Asia/Magadan [Magadan Time]", | ||||||
|  |   "Asia/Makassar": "Asia/Makassar [Central Indonesia Time]", | ||||||
|  |   "Asia/Manila": "Asia/Manila [Philippines Time]", | ||||||
|  |   "Asia/Muscat": "Asia/Muscat [Gulf Standard Time]", | ||||||
|  |   "Asia/Nicosia": "Asia/Nicosia [Eastern European Time]", | ||||||
|  |   "Asia/Novokuznetsk": "Asia/Novokuznetsk [Novosibirsk Time]", | ||||||
|  |   "Asia/Novosibirsk": "Asia/Novosibirsk [Novosibirsk Time]", | ||||||
|  |   "Asia/Omsk": "Asia/Omsk [Omsk Time]", | ||||||
|  |   "Asia/Oral": "Asia/Oral [Oral Time]", | ||||||
|  |   "Asia/Phnom_Penh": "Asia/Phnom_Penh [Indochina Time]", | ||||||
|  |   "Asia/Pontianak": "Asia/Pontianak [West Indonesia Time]", | ||||||
|  |   "Asia/Pyongyang": "Asia/Pyongyang [Korea Standard Time]", | ||||||
|  |   "Asia/Qatar": "Asia/Qatar [Arabia Standard Time]", | ||||||
|  |   "Asia/Qyzylorda": "Asia/Qyzylorda [Qyzylorda Time]", | ||||||
|  |   "Asia/Rangoon": "Asia/Rangoon [Myanmar Time]", | ||||||
|  |   "Asia/Riyadh": "Asia/Riyadh [Arabia Standard Time]", | ||||||
|  |   "Asia/Riyadh87": "Asia/Riyadh87 [GMT+03:07]", | ||||||
|  |   "Asia/Riyadh88": "Asia/Riyadh88 [GMT+03:07]", | ||||||
|  |   "Asia/Riyadh89": "Asia/Riyadh89 [GMT+03:07]", | ||||||
|  |   "Asia/Saigon": "Asia/Saigon [Indochina Time]", | ||||||
|  |   "Asia/Sakhalin": "Asia/Sakhalin [Sakhalin Time]", | ||||||
|  |   "Asia/Samarkand": "Asia/Samarkand [Uzbekistan Time]", | ||||||
|  |   "Asia/Seoul": "Asia/Seoul [Korea Standard Time]", | ||||||
|  |   "Asia/Shanghai": "Asia/Shanghai [China Standard Time]", | ||||||
|  |   "Asia/Singapore": "Asia/Singapore [Singapore Time]", | ||||||
|  |   "Asia/Taipei": "Asia/Taipei [China Standard Time]", | ||||||
|  |   "Asia/Tashkent": "Asia/Tashkent [Uzbekistan Time]", | ||||||
|  |   "Asia/Tbilisi": "Asia/Tbilisi [Georgia Time]", | ||||||
|  |   "Asia/Tehran": "Asia/Tehran [Iran Standard Time]", | ||||||
|  |   "Asia/Tel_Aviv": "Asia/Tel_Aviv [Israel Standard Time]", | ||||||
|  |   "Asia/Thimbu": "Asia/Thimbu [Bhutan Time]", | ||||||
|  |   "Asia/Thimphu": "Asia/Thimphu [Bhutan Time]", | ||||||
|  |   "Asia/Tokyo": "Asia/Tokyo [Japan Standard Time]", | ||||||
|  |   "Asia/Ujung_Pandang": "Asia/Ujung_Pandang [Central Indonesia Time]", | ||||||
|  |   "Asia/Ulaanbaatar": "Asia/Ulaanbaatar [Ulaanbaatar Time]", | ||||||
|  |   "Asia/Ulan_Bator": "Asia/Ulan_Bator [Ulaanbaatar Time]", | ||||||
|  |   "Asia/Urumqi": "Asia/Urumqi [China Standard Time]", | ||||||
|  |   "Asia/Ust-Nera": "Asia/Ust-Nera [GMT+11:00]", | ||||||
|  |   "Asia/Vientiane": "Asia/Vientiane [Indochina Time]", | ||||||
|  |   "Asia/Vladivostok": "Asia/Vladivostok [Vladivostok Time]", | ||||||
|  |   "Asia/Yakutsk": "Asia/Yakutsk [Yakutsk Time]", | ||||||
|  |   "Asia/Yekaterinburg": "Asia/Yekaterinburg [Yekaterinburg Time]", | ||||||
|  |   "Asia/Yerevan": "Asia/Yerevan [Armenia Time]", | ||||||
|  |   "Atlantic/Azores": "Atlantic/Azores [Azores Time]", | ||||||
|  |   "Atlantic/Bermuda": "Atlantic/Bermuda [Atlantic Standard Time]", | ||||||
|  |   "Atlantic/Canary": "Atlantic/Canary [Western European Time]", | ||||||
|  |   "Atlantic/Cape_Verde": "Atlantic/Cape_Verde [Cape Verde Time]", | ||||||
|  |   "Atlantic/Faeroe": "Atlantic/Faeroe [Western European Time]", | ||||||
|  |   "Atlantic/Faroe": "Atlantic/Faroe [Western European Time]", | ||||||
|  |   "Atlantic/Jan_Mayen": "Atlantic/Jan_Mayen [Central European Time]", | ||||||
|  |   "Atlantic/Madeira": "Atlantic/Madeira [Western European Time]", | ||||||
|  |   "Atlantic/Reykjavik": "Atlantic/Reykjavik [Greenwich Mean Time]", | ||||||
|  |   "Atlantic/South_Georgia": "Atlantic/South_Georgia [South Georgia Standard Time]", | ||||||
|  |   "Atlantic/St_Helena": "Atlantic/St_Helena [Greenwich Mean Time]", | ||||||
|  |   "Atlantic/Stanley": "Atlantic/Stanley [Falkland Is. Time]", | ||||||
|  |   "Australia/ACT": "Australia/ACT [Eastern Standard Time (New South Wales)]", | ||||||
|  |   "Australia/Adelaide": "Australia/Adelaide [Central Standard Time (South Australia)]", | ||||||
|  |   "Australia/Brisbane": "Australia/Brisbane [Eastern Standard Time (Queensland)]", | ||||||
|  |   "Australia/Broken_Hill": "Australia/Broken_Hill [Central Standard Time (South Australia/New South Wales)]", | ||||||
|  |   "Australia/Canberra": "Australia/Canberra [Eastern Standard Time (New South Wales)]", | ||||||
|  |   "Australia/Currie": "Australia/Currie [Eastern Standard Time (New South Wales)]", | ||||||
|  |   "Australia/Darwin": "Australia/Darwin [Central Standard Time (Northern Territory)]", | ||||||
|  |   "Australia/Eucla": "Australia/Eucla [Central Western Standard Time (Australia)]", | ||||||
|  |   "Australia/Hobart": "Australia/Hobart [Eastern Standard Time (Tasmania)]", | ||||||
|  |   "Australia/LHI": "Australia/LHI [Lord Howe Standard Time]", | ||||||
|  |   "Australia/Lindeman": "Australia/Lindeman [Eastern Standard Time (Queensland)]", | ||||||
|  |   "Australia/Lord_Howe": "Australia/Lord_Howe [Lord Howe Standard Time]", | ||||||
|  |   "Australia/Melbourne": "Australia/Melbourne [Eastern Standard Time (Victoria)]", | ||||||
|  |   "Australia/NSW": "Australia/NSW [Eastern Standard Time (New South Wales)]", | ||||||
|  |   "Australia/North": "Australia/North [Central Standard Time (Northern Territory)]", | ||||||
|  |   "Australia/Perth": "Australia/Perth [Western Standard Time (Australia)]", | ||||||
|  |   "Australia/Queensland": "Australia/Queensland [Eastern Standard Time (Queensland)]", | ||||||
|  |   "Australia/South": "Australia/South [Central Standard Time (South Australia)]", | ||||||
|  |   "Australia/Sydney": "Australia/Sydney [Eastern Standard Time (New South Wales)]", | ||||||
|  |   "Australia/Tasmania": "Australia/Tasmania [Eastern Standard Time (Tasmania)]", | ||||||
|  |   "Australia/Victoria": "Australia/Victoria [Eastern Standard Time (Victoria)]", | ||||||
|  |   "Australia/West": "Australia/West [Western Standard Time (Australia)]", | ||||||
|  |   "Australia/Yancowinna": "Australia/Yancowinna [Central Standard Time (South Australia/New South Wales)]", | ||||||
|  |   "BET": "BET [Brasilia Time]", | ||||||
|  |   "BST": "BST [Bangladesh Time]", | ||||||
|  |   "Brazil/Acre": "Brazil/Acre [Amazon Time]", | ||||||
|  |   "Brazil/DeNoronha": "Brazil/DeNoronha [Fernando de Noronha Time]", | ||||||
|  |   "Brazil/East": "Brazil/East [Brasilia Time]", | ||||||
|  |   "Brazil/West": "Brazil/West [Amazon Time]", | ||||||
|  |   "CAT": "CAT [Central African Time]", | ||||||
|  |   "CET": "CET [Central European Time]", | ||||||
|  |   "CNT": "CNT [Newfoundland Standard Time]", | ||||||
|  |   "CST": "CST [Central Standard Time]", | ||||||
|  |   "CST6CDT": "CST6CDT [Central Standard Time]", | ||||||
|  |   "CTT": "CTT [China Standard Time]", | ||||||
|  |   "Canada/Atlantic": "Canada/Atlantic [Atlantic Standard Time]", | ||||||
|  |   "Canada/Central": "Canada/Central [Central Standard Time]", | ||||||
|  |   "Canada/East-Saskatchewan": "Canada/East-Saskatchewan [Central Standard Time]", | ||||||
|  |   "Canada/Eastern": "Canada/Eastern [Eastern Standard Time]", | ||||||
|  |   "Canada/Mountain": "Canada/Mountain [Mountain Standard Time]", | ||||||
|  |   "Canada/Newfoundland": "Canada/Newfoundland [Newfoundland Standard Time]", | ||||||
|  |   "Canada/Pacific": "Canada/Pacific [Pacific Standard Time]", | ||||||
|  |   "Canada/Saskatchewan": "Canada/Saskatchewan [Central Standard Time]", | ||||||
|  |   "Canada/Yukon": "Canada/Yukon [Pacific Standard Time]", | ||||||
|  |   "Chile/Continental": "Chile/Continental [Chile Time]", | ||||||
|  |   "Chile/EasterIsland": "Chile/EasterIsland [Easter Is. Time]", | ||||||
|  |   "Cuba": "Cuba [Cuba Standard Time]", | ||||||
|  |   "EAT": "EAT [Eastern African Time]", | ||||||
|  |   "ECT": "ECT [Central European Time]", | ||||||
|  |   "EET": "EET [Eastern European Time]", | ||||||
|  |   "EST": "EST [Eastern Standard Time]", | ||||||
|  |   "EST5EDT": "EST5EDT [Eastern Standard Time]", | ||||||
|  |   "Egypt": "Egypt [Eastern European Time]", | ||||||
|  |   "Eire": "Eire [Greenwich Mean Time]", | ||||||
|  |   "Etc/GMT": "Etc/GMT [GMT+00:00]", | ||||||
|  |   "Etc/GMT+0": "Etc/GMT+0 [GMT+00:00]", | ||||||
|  |   "Etc/GMT+1": "Etc/GMT+1 [GMT-01:00]", | ||||||
|  |   "Etc/GMT+10": "Etc/GMT+10 [GMT-10:00]", | ||||||
|  |   "Etc/GMT+11": "Etc/GMT+11 [GMT-11:00]", | ||||||
|  |   "Etc/GMT+12": "Etc/GMT+12 [GMT-12:00]", | ||||||
|  |   "Etc/GMT+2": "Etc/GMT+2 [GMT-02:00]", | ||||||
|  |   "Etc/GMT+3": "Etc/GMT+3 [GMT-03:00]", | ||||||
|  |   "Etc/GMT+4": "Etc/GMT+4 [GMT-04:00]", | ||||||
|  |   "Etc/GMT+5": "Etc/GMT+5 [GMT-05:00]", | ||||||
|  |   "Etc/GMT+6": "Etc/GMT+6 [GMT-06:00]", | ||||||
|  |   "Etc/GMT+7": "Etc/GMT+7 [GMT-07:00]", | ||||||
|  |   "Etc/GMT+8": "Etc/GMT+8 [GMT-08:00]", | ||||||
|  |   "Etc/GMT+9": "Etc/GMT+9 [GMT-09:00]", | ||||||
|  |   "Etc/GMT-0": "Etc/GMT-0 [GMT+00:00]", | ||||||
|  |   "Etc/GMT-1": "Etc/GMT-1 [GMT+01:00]", | ||||||
|  |   "Etc/GMT-10": "Etc/GMT-10 [GMT+10:00]", | ||||||
|  |   "Etc/GMT-11": "Etc/GMT-11 [GMT+11:00]", | ||||||
|  |   "Etc/GMT-12": "Etc/GMT-12 [GMT+12:00]", | ||||||
|  |   "Etc/GMT-13": "Etc/GMT-13 [GMT+13:00]", | ||||||
|  |   "Etc/GMT-14": "Etc/GMT-14 [GMT+14:00]", | ||||||
|  |   "Etc/GMT-2": "Etc/GMT-2 [GMT+02:00]", | ||||||
|  |   "Etc/GMT-3": "Etc/GMT-3 [GMT+03:00]", | ||||||
|  |   "Etc/GMT-4": "Etc/GMT-4 [GMT+04:00]", | ||||||
|  |   "Etc/GMT-5": "Etc/GMT-5 [GMT+05:00]", | ||||||
|  |   "Etc/GMT-6": "Etc/GMT-6 [GMT+06:00]", | ||||||
|  |   "Etc/GMT-7": "Etc/GMT-7 [GMT+07:00]", | ||||||
|  |   "Etc/GMT-8": "Etc/GMT-8 [GMT+08:00]", | ||||||
|  |   "Etc/GMT-9": "Etc/GMT-9 [GMT+09:00]", | ||||||
|  |   "Etc/GMT0": "Etc/GMT0 [GMT+00:00]", | ||||||
|  |   "Etc/Greenwich": "Etc/Greenwich [Greenwich Mean Time]", | ||||||
|  |   "Etc/UCT": "Etc/UCT [Coordinated Universal Time]", | ||||||
|  |   "Etc/UTC": "Etc/UTC [Coordinated Universal Time]", | ||||||
|  |   "Etc/Universal": "Etc/Universal [Coordinated Universal Time]", | ||||||
|  |   "Etc/Zulu": "Etc/Zulu [Coordinated Universal Time]", | ||||||
|  |   "Europe/Amsterdam": "Europe/Amsterdam [Central European Time]", | ||||||
|  |   "Europe/Andorra": "Europe/Andorra [Central European Time]", | ||||||
|  |   "Europe/Athens": "Europe/Athens [Eastern European Time]", | ||||||
|  |   "Europe/Belfast": "Europe/Belfast [Greenwich Mean Time]", | ||||||
|  |   "Europe/Belgrade": "Europe/Belgrade [Central European Time]", | ||||||
|  |   "Europe/Berlin": "Europe/Berlin [Central European Time]", | ||||||
|  |   "Europe/Bratislava": "Europe/Bratislava [Central European Time]", | ||||||
|  |   "Europe/Brussels": "Europe/Brussels [Central European Time]", | ||||||
|  |   "Europe/Bucharest": "Europe/Bucharest [Eastern European Time]", | ||||||
|  |   "Europe/Budapest": "Europe/Budapest [Central European Time]", | ||||||
|  |   "Europe/Busingen": "Europe/Busingen [GMT+01:00]", | ||||||
|  |   "Europe/Chisinau": "Europe/Chisinau [Eastern European Time]", | ||||||
|  |   "Europe/Copenhagen": "Europe/Copenhagen [Central European Time]", | ||||||
|  |   "Europe/Dublin": "Europe/Dublin [Greenwich Mean Time]", | ||||||
|  |   "Europe/Gibraltar": "Europe/Gibraltar [Central European Time]", | ||||||
|  |   "Europe/Guernsey": "Europe/Guernsey [Greenwich Mean Time]", | ||||||
|  |   "Europe/Helsinki": "Europe/Helsinki [Eastern European Time]", | ||||||
|  |   "Europe/Isle_of_Man": "Europe/Isle_of_Man [Greenwich Mean Time]", | ||||||
|  |   "Europe/Istanbul": "Europe/Istanbul [Eastern European Time]", | ||||||
|  |   "Europe/Jersey": "Europe/Jersey [Greenwich Mean Time]", | ||||||
|  |   "Europe/Kaliningrad": "Europe/Kaliningrad [Eastern European Time]", | ||||||
|  |   "Europe/Kiev": "Europe/Kiev [Eastern European Time]", | ||||||
|  |   "Europe/Lisbon": "Europe/Lisbon [Western European Time]", | ||||||
|  |   "Europe/Ljubljana": "Europe/Ljubljana [Central European Time]", | ||||||
|  |   "Europe/London": "Europe/London [Greenwich Mean Time]", | ||||||
|  |   "Europe/Luxembourg": "Europe/Luxembourg [Central European Time]", | ||||||
|  |   "Europe/Madrid": "Europe/Madrid [Central European Time]", | ||||||
|  |   "Europe/Malta": "Europe/Malta [Central European Time]", | ||||||
|  |   "Europe/Mariehamn": "Europe/Mariehamn [Eastern European Time]", | ||||||
|  |   "Europe/Minsk": "Europe/Minsk [Eastern European Time]", | ||||||
|  |   "Europe/Monaco": "Europe/Monaco [Central European Time]", | ||||||
|  |   "Europe/Moscow": "Europe/Moscow [Moscow Standard Time]", | ||||||
|  |   "Europe/Nicosia": "Europe/Nicosia [Eastern European Time]", | ||||||
|  |   "Europe/Oslo": "Europe/Oslo [Central European Time]", | ||||||
|  |   "Europe/Paris": "Europe/Paris [Central European Time]", | ||||||
|  |   "Europe/Podgorica": "Europe/Podgorica [Central European Time]", | ||||||
|  |   "Europe/Prague": "Europe/Prague [Central European Time]", | ||||||
|  |   "Europe/Riga": "Europe/Riga [Eastern European Time]", | ||||||
|  |   "Europe/Rome": "Europe/Rome [Central European Time]", | ||||||
|  |   "Europe/Samara": "Europe/Samara [Samara Time]", | ||||||
|  |   "Europe/San_Marino": "Europe/San_Marino [Central European Time]", | ||||||
|  |   "Europe/Sarajevo": "Europe/Sarajevo [Central European Time]", | ||||||
|  |   "Europe/Simferopol": "Europe/Simferopol [Eastern European Time]", | ||||||
|  |   "Europe/Skopje": "Europe/Skopje [Central European Time]", | ||||||
|  |   "Europe/Sofia": "Europe/Sofia [Eastern European Time]", | ||||||
|  |   "Europe/Stockholm": "Europe/Stockholm [Central European Time]", | ||||||
|  |   "Europe/Tallinn": "Europe/Tallinn [Eastern European Time]", | ||||||
|  |   "Europe/Tirane": "Europe/Tirane [Central European Time]", | ||||||
|  |   "Europe/Tiraspol": "Europe/Tiraspol [Eastern European Time]", | ||||||
|  |   "Europe/Uzhgorod": "Europe/Uzhgorod [Eastern European Time]", | ||||||
|  |   "Europe/Vaduz": "Europe/Vaduz [Central European Time]", | ||||||
|  |   "Europe/Vatican": "Europe/Vatican [Central European Time]", | ||||||
|  |   "Europe/Vienna": "Europe/Vienna [Central European Time]", | ||||||
|  |   "Europe/Vilnius": "Europe/Vilnius [Eastern European Time]", | ||||||
|  |   "Europe/Volgograd": "Europe/Volgograd [Volgograd Time]", | ||||||
|  |   "Europe/Warsaw": "Europe/Warsaw [Central European Time]", | ||||||
|  |   "Europe/Zagreb": "Europe/Zagreb [Central European Time]", | ||||||
|  |   "Europe/Zaporozhye": "Europe/Zaporozhye [Eastern European Time]", | ||||||
|  |   "Europe/Zurich": "Europe/Zurich [Central European Time]", | ||||||
|  |   "GB": "GB [Greenwich Mean Time]", | ||||||
|  |   "GB-Eire": "GB-Eire [Greenwich Mean Time]", | ||||||
|  |   "GMT": "GMT [Greenwich Mean Time]", | ||||||
|  |   "GMT0": "GMT0 [GMT+00:00]", | ||||||
|  |   "Greenwich": "Greenwich [Greenwich Mean Time]", | ||||||
|  |   "HST": "HST [Hawaii Standard Time]", | ||||||
|  |   "Hongkong": "Hongkong [Hong Kong Time]", | ||||||
|  |   "IET": "IET [Eastern Standard Time]", | ||||||
|  |   "IST": "IST [India Standard Time]", | ||||||
|  |   "Iceland": "Iceland [Greenwich Mean Time]", | ||||||
|  |   "Indian/Antananarivo": "Indian/Antananarivo [Eastern African Time]", | ||||||
|  |   "Indian/Chagos": "Indian/Chagos [Indian Ocean Territory Time]", | ||||||
|  |   "Indian/Christmas": "Indian/Christmas [Christmas Island Time]", | ||||||
|  |   "Indian/Cocos": "Indian/Cocos [Cocos Islands Time]", | ||||||
|  |   "Indian/Comoro": "Indian/Comoro [Eastern African Time]", | ||||||
|  |   "Indian/Kerguelen": "Indian/Kerguelen [French Southern & Antarctic Lands Time]", | ||||||
|  |   "Indian/Mahe": "Indian/Mahe [Seychelles Time]", | ||||||
|  |   "Indian/Maldives": "Indian/Maldives [Maldives Time]", | ||||||
|  |   "Indian/Mauritius": "Indian/Mauritius [Mauritius Time]", | ||||||
|  |   "Indian/Mayotte": "Indian/Mayotte [Eastern African Time]", | ||||||
|  |   "Indian/Reunion": "Indian/Reunion [Reunion Time]", | ||||||
|  |   "Iran": "Iran [Iran Standard Time]", | ||||||
|  |   "Israel": "Israel [Israel Standard Time]", | ||||||
|  |   "JST": "JST [Japan Standard Time]", | ||||||
|  |   "Jamaica": "Jamaica [Eastern Standard Time]", | ||||||
|  |   "Japan": "Japan [Japan Standard Time]", | ||||||
|  |   "Kwajalein": "Kwajalein [Marshall Islands Time]", | ||||||
|  |   "Libya": "Libya [Eastern European Time]", | ||||||
|  |   "MET": "MET [Middle Europe Time]", | ||||||
|  |   "MIT": "MIT [West Samoa Time]", | ||||||
|  |   "MST": "MST [Mountain Standard Time]", | ||||||
|  |   "MST7MDT": "MST7MDT [Mountain Standard Time]", | ||||||
|  |   "Mexico/BajaNorte": "Mexico/BajaNorte [Pacific Standard Time]", | ||||||
|  |   "Mexico/BajaSur": "Mexico/BajaSur [Mountain Standard Time]", | ||||||
|  |   "Mexico/General": "Mexico/General [Central Standard Time]", | ||||||
|  |   "Mideast/Riyadh87": "Mideast/Riyadh87 [GMT+03:07]", | ||||||
|  |   "Mideast/Riyadh88": "Mideast/Riyadh88 [GMT+03:07]", | ||||||
|  |   "Mideast/Riyadh89": "Mideast/Riyadh89 [GMT+03:07]", | ||||||
|  |   "NET": "NET [Armenia Time]", | ||||||
|  |   "NST": "NST [New Zealand Standard Time]", | ||||||
|  |   "NZ": "NZ [New Zealand Standard Time]", | ||||||
|  |   "NZ-CHAT": "NZ-CHAT [Chatham Standard Time]", | ||||||
|  |   "Navajo": "Navajo [Mountain Standard Time]", | ||||||
|  |   "PLT": "PLT [Pakistan Time]", | ||||||
|  |   "PNT": "PNT [Mountain Standard Time]", | ||||||
|  |   "PRC": "PRC [China Standard Time]", | ||||||
|  |   "PRT": "PRT [Atlantic Standard Time]", | ||||||
|  |   "PST": "PST [Pacific Standard Time]", | ||||||
|  |   "PST8PDT": "PST8PDT [Pacific Standard Time]", | ||||||
|  |   "Pacific/Apia": "Pacific/Apia [West Samoa Time]", | ||||||
|  |   "Pacific/Auckland": "Pacific/Auckland [New Zealand Standard Time]", | ||||||
|  |   "Pacific/Chatham": "Pacific/Chatham [Chatham Standard Time]", | ||||||
|  |   "Pacific/Chuuk": "Pacific/Chuuk [GMT+10:00]", | ||||||
|  |   "Pacific/Easter": "Pacific/Easter [Easter Is. Time]", | ||||||
|  |   "Pacific/Efate": "Pacific/Efate [Vanuatu Time]", | ||||||
|  |   "Pacific/Enderbury": "Pacific/Enderbury [Phoenix Is. Time]", | ||||||
|  |   "Pacific/Fakaofo": "Pacific/Fakaofo [Tokelau Time]", | ||||||
|  |   "Pacific/Fiji": "Pacific/Fiji [Fiji Time]", | ||||||
|  |   "Pacific/Funafuti": "Pacific/Funafuti [Tuvalu Time]", | ||||||
|  |   "Pacific/Galapagos": "Pacific/Galapagos [Galapagos Time]", | ||||||
|  |   "Pacific/Gambier": "Pacific/Gambier [Gambier Time]", | ||||||
|  |   "Pacific/Guadalcanal": "Pacific/Guadalcanal [Solomon Is. Time]", | ||||||
|  |   "Pacific/Guam": "Pacific/Guam [Chamorro Standard Time]", | ||||||
|  |   "Pacific/Honolulu": "Pacific/Honolulu [Hawaii Standard Time]", | ||||||
|  |   "Pacific/Johnston": "Pacific/Johnston [Hawaii Standard Time]", | ||||||
|  |   "Pacific/Kiritimati": "Pacific/Kiritimati [Line Is. Time]", | ||||||
|  |   "Pacific/Kosrae": "Pacific/Kosrae [Kosrae Time]", | ||||||
|  |   "Pacific/Kwajalein": "Pacific/Kwajalein [Marshall Islands Time]", | ||||||
|  |   "Pacific/Majuro": "Pacific/Majuro [Marshall Islands Time]", | ||||||
|  |   "Pacific/Marquesas": "Pacific/Marquesas [Marquesas Time]", | ||||||
|  |   "Pacific/Midway": "Pacific/Midway [Samoa Standard Time]", | ||||||
|  |   "Pacific/Nauru": "Pacific/Nauru [Nauru Time]", | ||||||
|  |   "Pacific/Niue": "Pacific/Niue [Niue Time]", | ||||||
|  |   "Pacific/Norfolk": "Pacific/Norfolk [Norfolk Time]", | ||||||
|  |   "Pacific/Noumea": "Pacific/Noumea [New Caledonia Time]", | ||||||
|  |   "Pacific/Pago_Pago": "Pacific/Pago_Pago [Samoa Standard Time]", | ||||||
|  |   "Pacific/Palau": "Pacific/Palau [Palau Time]", | ||||||
|  |   "Pacific/Pitcairn": "Pacific/Pitcairn [Pitcairn Standard Time]", | ||||||
|  |   "Pacific/Pohnpei": "Pacific/Pohnpei [GMT+11:00]", | ||||||
|  |   "Pacific/Ponape": "Pacific/Ponape [Ponape Time]", | ||||||
|  |   "Pacific/Port_Moresby": "Pacific/Port_Moresby [Papua New Guinea Time]", | ||||||
|  |   "Pacific/Rarotonga": "Pacific/Rarotonga [Cook Is. Time]", | ||||||
|  |   "Pacific/Saipan": "Pacific/Saipan [Chamorro Standard Time]", | ||||||
|  |   "Pacific/Samoa": "Pacific/Samoa [Samoa Standard Time]", | ||||||
|  |   "Pacific/Tahiti": "Pacific/Tahiti [Tahiti Time]", | ||||||
|  |   "Pacific/Tarawa": "Pacific/Tarawa [Gilbert Is. Time]", | ||||||
|  |   "Pacific/Tongatapu": "Pacific/Tongatapu [Tonga Time]", | ||||||
|  |   "Pacific/Truk": "Pacific/Truk [Truk Time]", | ||||||
|  |   "Pacific/Wake": "Pacific/Wake [Wake Time]", | ||||||
|  |   "Pacific/Wallis": "Pacific/Wallis [Wallis & Futuna Time]", | ||||||
|  |   "Pacific/Yap": "Pacific/Yap [Truk Time]", | ||||||
|  |   "Portugal": "Portugal [Western European Time]", | ||||||
|  |   "ROK": "ROK [Korea Standard Time]", | ||||||
|  |   "SST": "SST [Solomon Is. Time]", | ||||||
|  |   "Singapore": "Singapore [Singapore Time]", | ||||||
|  |   "SystemV/AST4": "SystemV/AST4 [Atlantic Standard Time]", | ||||||
|  |   "SystemV/AST4ADT": "SystemV/AST4ADT [Atlantic Standard Time]", | ||||||
|  |   "SystemV/CST6": "SystemV/CST6 [Central Standard Time]", | ||||||
|  |   "SystemV/CST6CDT": "SystemV/CST6CDT [Central Standard Time]", | ||||||
|  |   "SystemV/EST5": "SystemV/EST5 [Eastern Standard Time]", | ||||||
|  |   "SystemV/EST5EDT": "SystemV/EST5EDT [Eastern Standard Time]", | ||||||
|  |   "SystemV/HST10": "SystemV/HST10 [Hawaii Standard Time]", | ||||||
|  |   "SystemV/MST7": "SystemV/MST7 [Mountain Standard Time]", | ||||||
|  |   "SystemV/MST7MDT": "SystemV/MST7MDT [Mountain Standard Time]", | ||||||
|  |   "SystemV/PST8": "SystemV/PST8 [Pacific Standard Time]", | ||||||
|  |   "SystemV/PST8PDT": "SystemV/PST8PDT [Pacific Standard Time]", | ||||||
|  |   "SystemV/YST9": "SystemV/YST9 [Alaska Standard Time]", | ||||||
|  |   "SystemV/YST9YDT": "SystemV/YST9YDT [Alaska Standard Time]", | ||||||
|  |   "Turkey": "Turkey [Eastern European Time]", | ||||||
|  |   "UCT": "UCT [Coordinated Universal Time]", | ||||||
|  |   "US/Alaska": "US/Alaska [Alaska Standard Time]", | ||||||
|  |   "US/Aleutian": "US/Aleutian [Hawaii-Aleutian Standard Time]", | ||||||
|  |   "US/Arizona": "US/Arizona [Mountain Standard Time]", | ||||||
|  |   "US/Central": "US/Central [Central Standard Time]", | ||||||
|  |   "US/East-Indiana": "US/East-Indiana [Eastern Standard Time]", | ||||||
|  |   "US/Eastern": "US/Eastern [Eastern Standard Time]", | ||||||
|  |   "US/Hawaii": "US/Hawaii [Hawaii Standard Time]", | ||||||
|  |   "US/Indiana-Starke": "US/Indiana-Starke [Central Standard Time]", | ||||||
|  |   "US/Michigan": "US/Michigan [Eastern Standard Time]", | ||||||
|  |   "US/Mountain": "US/Mountain [Mountain Standard Time]", | ||||||
|  |   "US/Pacific": "US/Pacific [Pacific Standard Time]", | ||||||
|  |   "US/Pacific-New": "US/Pacific-New [Pacific Standard Time]", | ||||||
|  |   "US/Samoa": "US/Samoa [Samoa Standard Time]", | ||||||
|  |   "UTC": "UTC [Coordinated Universal Time]", | ||||||
|  |   "Universal": "Universal [Coordinated Universal Time]", | ||||||
|  |   "VST": "VST [Indochina Time]", | ||||||
|  |   "W-SU": "W-SU [Moscow Standard Time]", | ||||||
|  |   "WET": "WET [Western European Time]", | ||||||
|  |   "Zulu": "Zulu [Coordinated Universal Time]" | ||||||
|  | } | ||||||
							
								
								
									
										438
									
								
								ui/src/views/storage/FormSchedule.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										438
									
								
								ui/src/views/storage/FormSchedule.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,438 @@ | |||||||
|  | // Licensed to the Apache Software Foundation (ASF) under one | ||||||
|  | // or more contributor license agreements.  See the NOTICE file | ||||||
|  | // distributed with this work for additional information | ||||||
|  | // regarding copyright ownership.  The ASF licenses this file | ||||||
|  | // to you under the Apache License, Version 2.0 (the | ||||||
|  | // "License"); you may not use this file except in compliance | ||||||
|  | // with the License.  You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //   http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, | ||||||
|  | // software distributed under the License is distributed on an | ||||||
|  | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||||||
|  | // KIND, either express or implied.  See the License for the | ||||||
|  | // specific language governing permissions and limitations | ||||||
|  | // under the License. | ||||||
|  | 
 | ||||||
|  | <template> | ||||||
|  |   <a-spin :spinning="loading"> | ||||||
|  |     <div class="form-layout"> | ||||||
|  |       <label> | ||||||
|  |         {{ $t('label.header.volume.snapshot') }} | ||||||
|  |       </label> | ||||||
|  |       <div class="form"> | ||||||
|  |         <a-form | ||||||
|  |           :form="form" | ||||||
|  |           layout="vertical" | ||||||
|  |           @submit="handleSubmit"> | ||||||
|  |           <a-row :gutter="12"> | ||||||
|  |             <a-col :md="24" :lg="24"> | ||||||
|  |               <a-form-item :label="$t('intervaltype')"> | ||||||
|  |                 <a-radio-group | ||||||
|  |                   v-decorator="['intervaltype', { | ||||||
|  |                     initialValue: intervalType | ||||||
|  |                   }]" | ||||||
|  |                   buttonStyle="solid" | ||||||
|  |                   @change="handleChangeIntervalType"> | ||||||
|  |                   <a-radio-button value="hourly" :disabled="handleVisibleInterval(0)"> | ||||||
|  |                     {{ $t('HOURLY') }} | ||||||
|  |                   </a-radio-button> | ||||||
|  |                   <a-radio-button value="daily" :disabled="handleVisibleInterval(1)"> | ||||||
|  |                     {{ $t('DAILY') }} | ||||||
|  |                   </a-radio-button> | ||||||
|  |                   <a-radio-button value="weekly" :disabled="handleVisibleInterval(2)"> | ||||||
|  |                     {{ $t('WEEKLY') }} | ||||||
|  |                   </a-radio-button> | ||||||
|  |                   <a-radio-button value="monthly" :disabled="handleVisibleInterval(3)"> | ||||||
|  |                     {{ $t('MONTHLY') }} | ||||||
|  |                   </a-radio-button> | ||||||
|  |                 </a-radio-group> | ||||||
|  |               </a-form-item> | ||||||
|  |             </a-col> | ||||||
|  |             <a-col :md="24" :lg="12" v-if="intervalType==='hourly'"> | ||||||
|  |               <a-form-item :label="$t('time')"> | ||||||
|  |                 <a-tooltip | ||||||
|  |                   placement="right" | ||||||
|  |                   :title="$t('label.minute.past.hour')"> | ||||||
|  |                   <a-input-number | ||||||
|  |                     style="width: 100%" | ||||||
|  |                     v-decorator="['time', { | ||||||
|  |                       rules: [{required: true, message: 'Please enter input'}] | ||||||
|  |                     }]" | ||||||
|  |                     :min="1" | ||||||
|  |                     :max="59"/> | ||||||
|  |                 </a-tooltip> | ||||||
|  |               </a-form-item> | ||||||
|  |             </a-col> | ||||||
|  |             <a-col :md="24" :lg="12" v-if="['daily', 'weekly', 'monthly'].includes(intervalType)"> | ||||||
|  |               <a-form-item | ||||||
|  |                 class="custom-time-select" | ||||||
|  |                 :label="$t('time')"> | ||||||
|  |                 <a-time-picker | ||||||
|  |                   use12Hours | ||||||
|  |                   format="h:mm A" | ||||||
|  |                   v-decorator="['timeSelect', { | ||||||
|  |                     rules: [{ | ||||||
|  |                       type: 'object', | ||||||
|  |                       required: true, | ||||||
|  |                       message: 'Please select time' | ||||||
|  |                     }] | ||||||
|  |                   }]" /> | ||||||
|  |               </a-form-item> | ||||||
|  |             </a-col> | ||||||
|  |             <a-col :md="24" :lg="12" v-if="intervalType==='weekly'"> | ||||||
|  |               <a-form-item :label="$t('label.day.of.week')"> | ||||||
|  |                 <a-select | ||||||
|  |                   v-decorator="['day-of-week', { | ||||||
|  |                     rules: [{ | ||||||
|  |                       required: true, | ||||||
|  |                       message: 'Please select option' | ||||||
|  |                     }] | ||||||
|  |                   }]" > | ||||||
|  |                   <a-select-option v-for="(opt, optIndex) in dayOfWeek" :key="optIndex"> | ||||||
|  |                     {{ opt.name || opt.description }} | ||||||
|  |                   </a-select-option> | ||||||
|  |                 </a-select> | ||||||
|  |               </a-form-item> | ||||||
|  |             </a-col> | ||||||
|  |             <a-col :md="24" :lg="12" v-if="intervalType==='monthly'"> | ||||||
|  |               <a-form-item :label="$t('label.day.of.month')"> | ||||||
|  |                 <a-select | ||||||
|  |                   v-decorator="['day-of-month', { | ||||||
|  |                     rules: [{ | ||||||
|  |                       required: true, | ||||||
|  |                       message: 'Please select option' | ||||||
|  |                     }] | ||||||
|  |                   }]"> | ||||||
|  |                   <a-select-option v-for="opt in dayOfMonth" :key="opt.name"> | ||||||
|  |                     {{ opt.name }} | ||||||
|  |                   </a-select-option> | ||||||
|  |                 </a-select> | ||||||
|  |               </a-form-item> | ||||||
|  |             </a-col> | ||||||
|  |             <a-col :md="24" :lg="12"> | ||||||
|  |               <a-form-item :label="$t('keep')"> | ||||||
|  |                 <a-tooltip | ||||||
|  |                   placement="right" | ||||||
|  |                   :title="$t('Snapshots')"> | ||||||
|  |                   <a-input-number | ||||||
|  |                     style="width: 100%" | ||||||
|  |                     v-decorator="['maxsnaps', { | ||||||
|  |                       rules: [{ required: true, message: 'Please enter input'}] | ||||||
|  |                     }]" | ||||||
|  |                     :min="1" | ||||||
|  |                     :max="8" /> | ||||||
|  |                 </a-tooltip> | ||||||
|  |               </a-form-item> | ||||||
|  |             </a-col> | ||||||
|  |             <a-col :md="24" :lg="24"> | ||||||
|  |               <a-form-item :label="$t('timezone')"> | ||||||
|  |                 <a-select | ||||||
|  |                   showSearch | ||||||
|  |                   v-decorator="['timezone', { | ||||||
|  |                     rules: [{ | ||||||
|  |                       required: true, | ||||||
|  |                       message: 'Please select option' | ||||||
|  |                     }] | ||||||
|  |                   }]" | ||||||
|  |                   :loading="fetching"> | ||||||
|  |                   <a-select-option v-for="opt in timeZoneMap" :key="opt.id"> | ||||||
|  |                     {{ opt.name || opt.description }} | ||||||
|  |                   </a-select-option> | ||||||
|  |                 </a-select> | ||||||
|  |               </a-form-item> | ||||||
|  |             </a-col> | ||||||
|  |           </a-row> | ||||||
|  |           <a-divider/> | ||||||
|  |           <div class="tagsTitle">{{ $t('tags') }}</div> | ||||||
|  |           <div> | ||||||
|  |             <template v-for="(tag, index) in tags"> | ||||||
|  |               <a-tag :key="index" :closable="true" :afterClose="() => handleDeleteTag(tag)"> | ||||||
|  |                 {{ tag.key }} = {{ tag.value }} | ||||||
|  |               </a-tag> | ||||||
|  |             </template> | ||||||
|  |             <div v-if="inputVisible"> | ||||||
|  |               <a-input-group | ||||||
|  |                 type="text" | ||||||
|  |                 size="small" | ||||||
|  |                 @blur="handleInputConfirm" | ||||||
|  |                 @keyup.enter="handleInputConfirm" | ||||||
|  |                 compact> | ||||||
|  |                 <a-input ref="input" :value="inputKey" @change="handleKeyChange" style="width: 100px; text-align: center" placeholder="Key" /> | ||||||
|  |                 <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff" placeholder="=" disabled /> | ||||||
|  |                 <a-input :value="inputValue" @change="handleValueChange" style="width: 100px; text-align: center; border-left: 0" placeholder="Value" /> | ||||||
|  |                 <a-button shape="circle" size="small" @click="handleInputConfirm"> | ||||||
|  |                   <a-icon type="check"/> | ||||||
|  |                 </a-button> | ||||||
|  |                 <a-button shape="circle" size="small" @click="inputVisible=false"> | ||||||
|  |                   <a-icon type="close"/> | ||||||
|  |                 </a-button> | ||||||
|  |               </a-input-group> | ||||||
|  |             </div> | ||||||
|  |             <a-tag v-else @click="showInput" style="background: #fff; borderStyle: dashed;"> | ||||||
|  |               <a-icon type="plus" /> {{ $t('label.new.tag') }} | ||||||
|  |             </a-tag> | ||||||
|  |           </div> | ||||||
|  |           <div :span="24" class="action-button"> | ||||||
|  |             <a-button | ||||||
|  |               :loading="actionLoading" | ||||||
|  |               @click="closeAction"> | ||||||
|  |               {{ this.$t('Cancel') }} | ||||||
|  |             </a-button> | ||||||
|  |             <a-button | ||||||
|  |               v-if="handleShowButton()" | ||||||
|  |               :loading="actionLoading" | ||||||
|  |               type="primary" | ||||||
|  |               @click="handleSubmit"> | ||||||
|  |               {{ this.$t('OK') }} | ||||||
|  |             </a-button> | ||||||
|  |           </div> | ||||||
|  |         </a-form> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |   </a-spin> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | import { api } from '@/api' | ||||||
|  | import { timeZone } from '@/utils/timezone' | ||||||
|  | import debounce from 'lodash/debounce' | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: 'FormSchedule', | ||||||
|  |   props: { | ||||||
|  |     loading: { | ||||||
|  |       type: Boolean, | ||||||
|  |       default: false | ||||||
|  |     }, | ||||||
|  |     dataSource: { | ||||||
|  |       type: Array, | ||||||
|  |       required: true | ||||||
|  |     }, | ||||||
|  |     resource: { | ||||||
|  |       type: Object, | ||||||
|  |       required: true | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   data () { | ||||||
|  |     this.fetchTimeZone = debounce(this.fetchTimeZone, 800) | ||||||
|  | 
 | ||||||
|  |     return { | ||||||
|  |       actionLoading: false, | ||||||
|  |       volumeId: '', | ||||||
|  |       inputKey: '', | ||||||
|  |       inputVisible: '', | ||||||
|  |       inputValue: '', | ||||||
|  |       intervalType: 'hourly', | ||||||
|  |       intervalValue: 0, | ||||||
|  |       tags: [], | ||||||
|  |       dayOfWeek: [], | ||||||
|  |       dayOfMonth: [], | ||||||
|  |       timeZoneMap: [], | ||||||
|  |       fetching: false, | ||||||
|  |       listDayOfWeek: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'] | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   beforeCreate () { | ||||||
|  |     this.form = this.$form.createForm(this) | ||||||
|  |   }, | ||||||
|  |   mounted () { | ||||||
|  |     this.volumeId = this.resource.id | ||||||
|  |     this.fetchTimeZone() | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     fetchTimeZone (value) { | ||||||
|  |       this.timeZoneMap = [] | ||||||
|  |       this.fetching = true | ||||||
|  | 
 | ||||||
|  |       timeZone(value).then(json => { | ||||||
|  |         this.timeZoneMap = json | ||||||
|  |         this.fetching = false | ||||||
|  |       }) | ||||||
|  |     }, | ||||||
|  |     fetchDayOfWeek () { | ||||||
|  |       this.dayOfWeek = [] | ||||||
|  | 
 | ||||||
|  |       for (const index in this.listDayOfWeek) { | ||||||
|  |         const dayName = this.listDayOfWeek[index] | ||||||
|  |         this.dayOfWeek.push({ | ||||||
|  |           id: dayName, | ||||||
|  |           name: this.$t(dayName) | ||||||
|  |         }) | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     fetchDayOfMonth () { | ||||||
|  |       this.dayOfMonth = [] | ||||||
|  |       const maxDayOfMonth = 28 | ||||||
|  |       for (let num = 1; num <= maxDayOfMonth; num++) { | ||||||
|  |         this.dayOfMonth.push({ | ||||||
|  |           id: num, | ||||||
|  |           name: num | ||||||
|  |         }) | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     handleChangeIntervalType (e) { | ||||||
|  |       this.intervalType = e.target.value | ||||||
|  | 
 | ||||||
|  |       switch (this.intervalType) { | ||||||
|  |         case 'hourly': | ||||||
|  |           this.intervalValue = 0 | ||||||
|  |           break | ||||||
|  |         case 'daily': | ||||||
|  |           this.intervalValue = 1 | ||||||
|  |           break | ||||||
|  |         case 'weekly': | ||||||
|  |           this.intervalValue = 2 | ||||||
|  |           this.fetchDayOfWeek() | ||||||
|  |           break | ||||||
|  |         case 'monthly': | ||||||
|  |           this.intervalValue = 3 | ||||||
|  |           this.fetchDayOfMonth() | ||||||
|  |           break | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     handleVisibleInterval (intervalType) { | ||||||
|  |       if (this.dataSource.length === 0) { | ||||||
|  |         return false | ||||||
|  |       } | ||||||
|  |       const dataSource = this.dataSource.filter(item => item.intervaltype === intervalType) | ||||||
|  |       if (dataSource && dataSource.length > 0) { | ||||||
|  |         return true | ||||||
|  |       } | ||||||
|  |       return false | ||||||
|  |     }, | ||||||
|  |     handleShowButton () { | ||||||
|  |       if (this.dataSource.length === 0) { | ||||||
|  |         return true | ||||||
|  |       } | ||||||
|  |       const dataSource = this.dataSource.filter(item => item.intervaltype === this.intervalValue) | ||||||
|  |       if (dataSource && dataSource.length > 0) { | ||||||
|  |         return false | ||||||
|  |       } | ||||||
|  |       return true | ||||||
|  |     }, | ||||||
|  |     handleKeyChange (e) { | ||||||
|  |       this.inputKey = e.target.value | ||||||
|  |     }, | ||||||
|  |     handleValueChange (e) { | ||||||
|  |       this.inputValue = e.target.value | ||||||
|  |     }, | ||||||
|  |     handleInputConfirm () { | ||||||
|  |       this.tags.push({ | ||||||
|  |         key: this.inputKey, | ||||||
|  |         value: this.inputValue | ||||||
|  |       }) | ||||||
|  |       this.inputVisible = false | ||||||
|  |       this.inputKey = '' | ||||||
|  |       this.inputValue = '' | ||||||
|  |     }, | ||||||
|  |     handleDeleteTag (tag) { | ||||||
|  |     }, | ||||||
|  |     handleSubmit (e) { | ||||||
|  |       this.form.validateFields((error, values) => { | ||||||
|  |         if (error) { | ||||||
|  |           return | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         let params = {} | ||||||
|  |         params.volumeid = this.volumeId | ||||||
|  |         params.intervaltype = values.intervaltype | ||||||
|  |         params.timezone = values.timezone | ||||||
|  |         params.maxsnaps = values.maxsnaps | ||||||
|  |         switch (values.intervaltype) { | ||||||
|  |           case 'hourly': | ||||||
|  |             params.schedule = values.time | ||||||
|  |             break | ||||||
|  |           case 'daily': | ||||||
|  |             params.schedule = values.timeSelect.format('mm:HH') | ||||||
|  |             break | ||||||
|  |           case 'weekly': | ||||||
|  |             params.schedule = [values.timeSelect.format('mm:HH'), (values['day-of-week'] + 1)].join(':') | ||||||
|  |             break | ||||||
|  |           case 'monthly': | ||||||
|  |             params.schedule = [values.timeSelect.format('mm:HH'), values['day-of-month']].join(':') | ||||||
|  |             break | ||||||
|  |         } | ||||||
|  |         for (let i = 0; i < this.tags.length; i++) { | ||||||
|  |           const formattedTagData = {} | ||||||
|  |           const tag = this.tags[i] | ||||||
|  |           formattedTagData['tags[' + i + '].key'] = tag.key | ||||||
|  |           formattedTagData['tags[' + i + '].value'] = tag.value | ||||||
|  |           params = Object.assign({}, params, formattedTagData) | ||||||
|  |         } | ||||||
|  |         this.actionLoading = true | ||||||
|  |         api('createSnapshotPolicy', params).then(json => { | ||||||
|  |           this.$emit('refresh') | ||||||
|  |           this.$notification.success({ | ||||||
|  |             message: 'Recurring Snapshots', | ||||||
|  |             description: 'Successfully recurring snapshots' | ||||||
|  |           }) | ||||||
|  |           this.resetForm() | ||||||
|  |         }).catch(error => { | ||||||
|  |           this.$notification.error({ | ||||||
|  |             message: 'Request Failed', | ||||||
|  |             description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message | ||||||
|  |           }) | ||||||
|  |         }).finally(() => { | ||||||
|  |           this.actionLoading = false | ||||||
|  |         }) | ||||||
|  |       }) | ||||||
|  |     }, | ||||||
|  |     showInput () { | ||||||
|  |       this.inputVisible = true | ||||||
|  |       this.$nextTick(function () { | ||||||
|  |         this.$refs.input.focus() | ||||||
|  |       }) | ||||||
|  |     }, | ||||||
|  |     resetForm () { | ||||||
|  |       this.form.setFieldsValue({ | ||||||
|  |         time: undefined, | ||||||
|  |         timezone: undefined, | ||||||
|  |         timeSelect: undefined, | ||||||
|  |         maxsnaps: undefined, | ||||||
|  |         'day-of-week': undefined, | ||||||
|  |         'day-of-month': undefined | ||||||
|  |       }) | ||||||
|  |       this.tags = [] | ||||||
|  |     }, | ||||||
|  |     closeAction () { | ||||||
|  |       this.$emit('close-action') | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="less" scoped> | ||||||
|  | .form-layout { | ||||||
|  |   .ant-tag { | ||||||
|  |     margin-bottom: 10px; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /deep/.custom-time-select .ant-time-picker { | ||||||
|  |     width: 100%; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /deep/.ant-divider-horizontal { | ||||||
|  |     margin-top: 0; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .form { | ||||||
|  |   margin: 10px 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .tagsTitle { | ||||||
|  |   font-weight: 500; | ||||||
|  |   color: rgba(0, 0, 0, 0.85); | ||||||
|  |   margin-bottom: 12px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .action-button { | ||||||
|  |   text-align: right; | ||||||
|  | 
 | ||||||
|  |   button { | ||||||
|  |     margin-right: 5px; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </style> | ||||||
							
								
								
									
										95
									
								
								ui/src/views/storage/RecurringSnapshotVolume.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								ui/src/views/storage/RecurringSnapshotVolume.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | |||||||
|  | // Licensed to the Apache Software Foundation (ASF) under one | ||||||
|  | // or more contributor license agreements.  See the NOTICE file | ||||||
|  | // distributed with this work for additional information | ||||||
|  | // regarding copyright ownership.  The ASF licenses this file | ||||||
|  | // to you under the Apache License, Version 2.0 (the | ||||||
|  | // "License"); you may not use this file except in compliance | ||||||
|  | // with the License.  You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //   http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, | ||||||
|  | // software distributed under the License is distributed on an | ||||||
|  | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||||||
|  | // KIND, either express or implied.  See the License for the | ||||||
|  | // specific language governing permissions and limitations | ||||||
|  | // under the License. | ||||||
|  | 
 | ||||||
|  | <template> | ||||||
|  |   <div class="snapshot-layout"> | ||||||
|  |     <a-tabs defaultActiveKey="1"> | ||||||
|  |       <a-tab-pane :tab="$t('schedule')" key="1"> | ||||||
|  |         <FormSchedule | ||||||
|  |           :loading="loading" | ||||||
|  |           :resource="resource" | ||||||
|  |           :dataSource="dataSource" | ||||||
|  |           @close-action="closeAction" | ||||||
|  |           @refresh="handleRefresh"/> | ||||||
|  |       </a-tab-pane> | ||||||
|  |       <a-tab-pane :tab="$t('label.scheduled.snapshots')" key="2"> | ||||||
|  |         <ScheduledSnapshots | ||||||
|  |           :loading="loading" | ||||||
|  |           :resource="resource" | ||||||
|  |           :dataSource="dataSource" | ||||||
|  |           @refresh="handleRefresh" | ||||||
|  |           @close-action="closeAction"/> | ||||||
|  |       </a-tab-pane> | ||||||
|  |     </a-tabs> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | import { api } from '@/api' | ||||||
|  | import FormSchedule from '@/views/storage/FormSchedule' | ||||||
|  | import ScheduledSnapshots from '@/views/storage/ScheduledSnapshots' | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: 'RecurringSnapshotVolume', | ||||||
|  |   components: { | ||||||
|  |     FormSchedule, | ||||||
|  |     ScheduledSnapshots | ||||||
|  |   }, | ||||||
|  |   props: { | ||||||
|  |     resource: { | ||||||
|  |       type: Object, | ||||||
|  |       required: true | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   data () { | ||||||
|  |     return { | ||||||
|  |       loading: false, | ||||||
|  |       dataSource: [] | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   mounted () { | ||||||
|  |     this.fetchData() | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     fetchData () { | ||||||
|  |       const params = {} | ||||||
|  |       this.dataSource = [] | ||||||
|  |       this.loading = true | ||||||
|  |       params.volumeid = this.resource.id | ||||||
|  |       api('listSnapshotPolicies', params).then(json => { | ||||||
|  |         this.loading = false | ||||||
|  |         const listSnapshotPolicies = json.listsnapshotpoliciesresponse.snapshotpolicy | ||||||
|  |         if (listSnapshotPolicies && listSnapshotPolicies.length > 0) { | ||||||
|  |           this.dataSource = listSnapshotPolicies | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |     }, | ||||||
|  |     handleRefresh () { | ||||||
|  |       this.fetchData() | ||||||
|  |     }, | ||||||
|  |     closeAction () { | ||||||
|  |       this.$emit('close-action') | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="less" scoped> | ||||||
|  |   .snapshot-layout { | ||||||
|  |     max-width: 600px; | ||||||
|  |   } | ||||||
|  | </style> | ||||||
							
								
								
									
										226
									
								
								ui/src/views/storage/ScheduledSnapshots.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								ui/src/views/storage/ScheduledSnapshots.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,226 @@ | |||||||
|  | // Licensed to the Apache Software Foundation (ASF) under one | ||||||
|  | // or more contributor license agreements.  See the NOTICE file | ||||||
|  | // distributed with this work for additional information | ||||||
|  | // regarding copyright ownership.  The ASF licenses this file | ||||||
|  | // to you under the Apache License, Version 2.0 (the | ||||||
|  | // "License"); you may not use this file except in compliance | ||||||
|  | // with the License.  You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //   http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, | ||||||
|  | // software distributed under the License is distributed on an | ||||||
|  | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||||||
|  | // KIND, either express or implied.  See the License for the | ||||||
|  | // specific language governing permissions and limitations | ||||||
|  | // under the License. | ||||||
|  | 
 | ||||||
|  | <template> | ||||||
|  |   <div class="list-schedule"> | ||||||
|  |     <a-table | ||||||
|  |       size="small" | ||||||
|  |       :columns="columns" | ||||||
|  |       :dataSource="dataSchedules" | ||||||
|  |       :rowKey="record => record.id" | ||||||
|  |       :pagination="false" | ||||||
|  |       :loading="loading"> | ||||||
|  |       <div slot="icon" slot-scope="text, record"> | ||||||
|  |         <label class="interval-icon"> | ||||||
|  |           <span v-if="record.intervaltype===0"> | ||||||
|  |             <a-icon type="clock-circle" /> | ||||||
|  |           </span> | ||||||
|  |           <span class="custom-icon icon-daily" v-else-if="record.intervaltype===1"> | ||||||
|  |             <a-icon type="calendar" /> | ||||||
|  |           </span> | ||||||
|  |           <span class="custom-icon icon-weekly" v-else-if="record.intervaltype===2"> | ||||||
|  |             <a-icon type="calendar" /> | ||||||
|  |           </span> | ||||||
|  |           <span class="custom-icon icon-monthly" v-else-if="record.intervaltype===3"> | ||||||
|  |             <a-icon type="calendar" /> | ||||||
|  |           </span> | ||||||
|  |         </label> | ||||||
|  |       </div> | ||||||
|  |       <div slot="time" slot-scope="text, record"> | ||||||
|  |         <label class="interval-content"> | ||||||
|  |           <span v-if="record.intervaltype===0">{{ record.schedule + $t('label.min.past.hour') }}</span> | ||||||
|  |           <span v-else>{{ record.schedule.split(':')[1] + ':' + record.schedule.split(':')[0] }}</span> | ||||||
|  |         </label> | ||||||
|  |       </div> | ||||||
|  |       <div slot="interval" slot-scope="text, record"> | ||||||
|  |         <span v-if="record.intervaltype===2"> | ||||||
|  |           {{ $t('label.interval.weekly').replace('{number}', $t(listDayOfWeek[record.schedule.split(':')[2] - 1])) }} | ||||||
|  |         </span> | ||||||
|  |         <span v-else-if="record.intervaltype===3"> | ||||||
|  |           {{ $t('label.interval.monthly').replace('{number}', record.schedule.split(':')[2]) }} | ||||||
|  |         </span> | ||||||
|  |       </div> | ||||||
|  |       <div slot="timezone" slot-scope="text, record"> | ||||||
|  |         <label>{{ getTimeZone(record.timezone) }}</label> | ||||||
|  |       </div> | ||||||
|  |       <div slot="tags" slot-scope="text, record"> | ||||||
|  |         <a-tag v-for="(tag, index) in record.tags" :key="index">{{ tag.key + '=' + tag.value }}</a-tag> | ||||||
|  |       </div> | ||||||
|  |       <div slot="action" class="account-button-action" slot-scope="text, record"> | ||||||
|  |         <a-tooltip placement="top"> | ||||||
|  |           <template slot="title"> | ||||||
|  |             {{ $t('label.delete.schedule') }} | ||||||
|  |           </template> | ||||||
|  |           <a-button | ||||||
|  |             type="danger" | ||||||
|  |             shape="circle" | ||||||
|  |             icon="close" | ||||||
|  |             size="small" | ||||||
|  |             :loading="actionLoading" | ||||||
|  |             @click="handleClickDelete(record)"/> | ||||||
|  |         </a-tooltip> | ||||||
|  |       </div> | ||||||
|  |     </a-table> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | import { api } from '@/api' | ||||||
|  | import { timeZoneName } from '@/utils/timezone' | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: 'ScheduledSnapshots', | ||||||
|  |   props: { | ||||||
|  |     loading: { | ||||||
|  |       type: Boolean, | ||||||
|  |       default: false | ||||||
|  |     }, | ||||||
|  |     dataSource: { | ||||||
|  |       type: Array, | ||||||
|  |       required: true | ||||||
|  |     }, | ||||||
|  |     resource: { | ||||||
|  |       type: Object, | ||||||
|  |       required: true | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   data () { | ||||||
|  |     return { | ||||||
|  |       actionLoading: false, | ||||||
|  |       columns: [], | ||||||
|  |       dataSchedules: [], | ||||||
|  |       listDayOfWeek: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'] | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   created () { | ||||||
|  |     this.columns = [ | ||||||
|  |       { | ||||||
|  |         title: '', | ||||||
|  |         dataIndex: 'icon', | ||||||
|  |         width: 30, | ||||||
|  |         scopedSlots: { customRender: 'icon' } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: this.$t('time'), | ||||||
|  |         dataIndex: 'schedule', | ||||||
|  |         scopedSlots: { customRender: 'time' } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: '', | ||||||
|  |         dataIndex: 'interval', | ||||||
|  |         scopedSlots: { customRender: 'interval' } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: this.$t('timezone'), | ||||||
|  |         dataIndex: 'timezone', | ||||||
|  |         scopedSlots: { customRender: 'timezone' } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: this.$t('keep'), | ||||||
|  |         dataIndex: 'maxsnaps', | ||||||
|  |         scopedSlots: { customRender: 'keep' } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: this.$t('tags'), | ||||||
|  |         dataIndex: 'tags', | ||||||
|  |         scopedSlots: { customRender: 'tags' } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: this.$t('action'), | ||||||
|  |         dataIndex: 'action', | ||||||
|  |         width: 50, | ||||||
|  |         scopedSlots: { customRender: 'action' } | ||||||
|  |       } | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   mounted () { | ||||||
|  |     this.dataSchedules = this.dataSource | ||||||
|  |   }, | ||||||
|  |   watch: { | ||||||
|  |     dataSource (newData, oldData) { | ||||||
|  |       this.dataSchedules = newData | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     handleClickDelete (record) { | ||||||
|  |       const params = {} | ||||||
|  |       params.id = record.id | ||||||
|  |       this.actionLoading = true | ||||||
|  |       api('deleteSnapshotPolicies', params).then(json => { | ||||||
|  |         if (json.deletesnapshotpoliciesresponse.success) { | ||||||
|  |           this.$notification.success({ | ||||||
|  |             message: 'Delete Snapshot Policy', | ||||||
|  |             description: 'Successfully deleted snapshot policy' | ||||||
|  |           }) | ||||||
|  | 
 | ||||||
|  |           this.$emit('refresh') | ||||||
|  |         } | ||||||
|  |       }).catch(error => { | ||||||
|  |         this.$notification.error({ | ||||||
|  |           message: 'Request Failed', | ||||||
|  |           description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message | ||||||
|  |         }) | ||||||
|  |       }).finally(() => { | ||||||
|  |         this.actionLoading = false | ||||||
|  |       }) | ||||||
|  |     }, | ||||||
|  |     getTimeZone (timeZone) { | ||||||
|  |       return timeZoneName(timeZone) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="less" scoped> | ||||||
|  |   .interval-icon { | ||||||
|  |     span { | ||||||
|  |       position: relative; | ||||||
|  |       font-size: 18px; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .custom-icon:before { | ||||||
|  |       font-size: 8px; | ||||||
|  |       position: absolute; | ||||||
|  |       top: 8px; | ||||||
|  |       left: 3.5px; | ||||||
|  |       color: #000; | ||||||
|  |       font-weight: 700; | ||||||
|  |       line-height: 1.7; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .icon-daily:before { | ||||||
|  |       content: "01"; | ||||||
|  |       left: 5px; | ||||||
|  |       top: 7px; | ||||||
|  |       line-height: 1.9; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .icon-weekly:before { | ||||||
|  |       content: "1-7"; | ||||||
|  |       left: 3px; | ||||||
|  |       line-height: 1.7; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .icon-monthly:before { | ||||||
|  |       content: "***"; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /deep/.ant-btn > .anticon { | ||||||
|  |     line-height: 1.8; | ||||||
|  |   } | ||||||
|  | </style> | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user