11import boto .ec2
2+ import collections
23import sys
34
45from datetime import datetime
@@ -30,6 +31,12 @@ def __init__(self, region='us-east-1', iso=False, verbose=False):
3031 def use_verbose (self ):
3132 self .verbose = True
3233
34+ def use_iso (self ):
35+ self .iso = True
36+
37+ def set_region (self , region ):
38+ self .conn = boto .ec2 .connect_to_region (region )
39+
3340 def all (self , instance_ids = None ):
3441 """Read weekday run times for all or specific EC2 instances.
3542
@@ -38,6 +45,8 @@ def all(self, instance_ids=None):
3845 IDs
3946 """
4047 data = {}
48+ Time = collections .namedtuple ('Time' ,
49+ ['weekday' , 'start_time' , 'end_time' ])
4150 instances = self .conn .get_only_instances (instance_ids = instance_ids )
4251 for instance in instances :
4352 times = instance .tags .get ('times' )
@@ -55,7 +64,9 @@ def all(self, instance_ids=None):
5564 end_time = end_time .strftime ('%H:%M' )
5665 weekday = (self .weekdays [i + 1 ]
5766 if self .iso else self .weekdays [i ])
58- data [instance .id ].append ((weekday , start_time , end_time ,))
67+ data [instance .id ].append (
68+ Time (weekday , start_time , end_time )
69+ )
5970 return data
6071
6172 def set (self , instance_ids = None , weekdays = None , start_time = None ,
@@ -75,7 +86,7 @@ def set(self, instance_ids=None, weekdays=None, start_time=None,
7586 start_time = datetime .strptime (start_time , '%I:%M %p' )
7687 end_time = datetime .strptime (end_time , '%I:%M %p' )
7788 if start_time >= end_time :
78- raise ValueError ('start time can\' t be greater than end time' )
89+ raise ValueError ('Start time can\' t be greater than end time' )
7990 start_time = start_time .strftime ('%H:%M' )
8091 end_time = end_time .strftime ('%H:%M' )
8192 updated = '{0}-{1}' .format (start_time , end_time )
@@ -130,6 +141,28 @@ def set(self, instance_ids=None, weekdays=None, start_time=None,
130141 except self .conn .ResponseError , e :
131142 raise e
132143
144+ def unset (self , instance_ids = None , weekdays = None ):
145+ """Unset instance times for specific weekdays or all weekdays."""
146+ # integer representation of `weekdays`
147+ if weekdays == ['*' ]:
148+ # All 7 days
149+ weekdays = range (len (self .weekdays ))
150+ else :
151+ weekdays = [self .weekdays .index (weekday ) for weekday in weekdays ]
152+ instances = self .conn .get_only_instances (instance_ids = instance_ids )
153+ for instance in instances :
154+ times = instance .tags .get ('times' )
155+ if times :
156+ times = times .split (';' )
157+ for weekday in weekdays :
158+ times [weekday ] = None
159+ times = ';' .join ([str (time ) for time in times ])
160+ try :
161+ # Overwrite existing `times` tag with new value
162+ instance .add_tag ('times' , times )
163+ except self .conn .ResponseError , e :
164+ raise e
165+
133166 def check (self , instance_ids = None ):
134167 """Check the state of instances and either start or stop them
135168 based on the current time restrictions set for the current day.
0 commit comments