@@ -96,34 +96,117 @@ def reference_lookup(self, resource_table_id, tag_type):
9696 |Vlan |NETWORK_VLAN|
9797 |Dedicated Host |DEDICATED_HOST|
9898 """
99+ service = self .type_to_service (tag_type )
100+ if service is None :
101+ raise SoftLayerAPIError (404 , "Unable to lookup {} types" .format (tag_type ))
102+ # return {}
103+ return self .client .call (service , 'getObject' , id = resource_table_id )
104+
105+ def delete_tag (self , name ):
106+ """Calls SoftLayer_Tag::deleteTag
107+
108+ :param string name: tag name to delete
109+ """
110+ return self .client .call ('SoftLayer_Tag' , 'deleteTag' , name )
111+
112+ def set_tags (self , tags , key_name , resource_id ):
113+ """Calls SoftLayer_Tag::setTags()
114+
115+ :param string tags: List of tags.
116+ :param string key_name: Key name of a tag type.
117+ :param int resource_id: ID of the object being tagged.
118+ """
119+ return self .client .call ('SoftLayer_Tag' , 'setTags' , tags , key_name , resource_id )
99120
121+ def get_all_tag_types (self ):
122+ """Calls SoftLayer_Tag::getAllTagTypes()"""
123+ types = self .client .call ('SoftLayer_Tag' , 'getAllTagTypes' )
124+ useable_types = []
125+ for tag_type in types :
126+ service = self .type_to_service (tag_type ['keyName' ])
127+ # Mostly just to remove the types that are not user taggable.
128+ if service is not None :
129+ temp_type = tag_type
130+ temp_type ['service' ] = service
131+ useable_types .append (temp_type )
132+ return useable_types
133+
134+ def taggable_by_type (self , tag_type ):
135+ """Returns a list of resources that can be tagged, that are of the given type
136+
137+ :param string tag_type: Key name of a tag type. See SoftLayer_Tag::getAllTagTypes
138+ """
139+ service = self .type_to_service (tag_type )
140+ search_term = "_objectType:SoftLayer_{}" .format (service )
141+ if tag_type == 'TICKET' :
142+ search_term = "{} status.name: open" .format (search_term )
143+ elif tag_type == 'IMAGE_TEMPLATE' :
144+ mask = "mask[id,accountId,name,globalIdentifier,parentId,publicFlag,flexImageFlag,imageType]"
145+ resources = self .client .call ('SoftLayer_Account' , 'getPrivateBlockDeviceTemplateGroups' ,
146+ mask = mask , iter = True )
147+ to_return = []
148+ # Fake search result output
149+ for resource in resources :
150+ to_return .append ({'resourceType' :service , 'resource' :resource })
151+ return to_return
152+ elif tag_type == 'NETWORK_SUBNET' :
153+ resources = self .client .call ('SoftLayer_Account' , 'getSubnets' , iter = True )
154+ to_return = []
155+ # Fake search result output
156+ for resource in resources :
157+ to_return .append ({'resourceType' :service , 'resource' :resource })
158+ return to_return
159+ resources = self .client .call ('SoftLayer_Search' , 'advancedSearch' , search_term , iter = True )
160+ return resources
161+
162+ @staticmethod
163+ def type_to_service (tag_type ):
164+ """Returns the SoftLayer service for the given tag_type"""
165+ service = None
100166 if tag_type in ['ACCOUNT_DOCUMENT' , 'CONTRACT' ]:
101- raise SoftLayerAPIError ( 404 , "Unable to lookup {} types" . format ( tag_type ))
167+ return None
102168
103169 if tag_type == 'APPLICATION_DELIVERY_CONTROLLER' :
104170 service = 'Network_Application_Delivery_Controller'
105171 elif tag_type == 'GUEST' :
106172 service = 'Virtual_Guest'
107173 elif tag_type == 'DEDICATED_HOST' :
108174 service = 'Virtual_DedicatedHost'
175+ elif tag_type == 'IMAGE_TEMPLATE' :
176+ service = 'Virtual_Guest_Block_Device_Template_Group'
109177 else :
110178
111179 tag_type = tag_type .lower ()
112180 # Sets the First letter, and any letter preceeded by a '_' to uppercase
113181 # HARDWARE -> Hardware, NETWORK_VLAN -> Network_Vlan for example.
114182 service = re .sub (r'(^[a-z]|\_[a-z])' , lambda x : x .group ().upper (), tag_type )
183+ return service
184+
185+ # @staticmethod
186+ # def type_to_datatype(tag_type):
187+ # """Returns the SoftLayer datatye for the given tag_type"""
188+ # datatye = None
189+ # if tag_type in ['ACCOUNT_DOCUMENT', 'CONTRACT']:
190+ # return None
191+
192+ # if tag_type == 'APPLICATION_DELIVERY_CONTROLLER':
193+ # datatye = 'adcLoadBalancers'
194+ # elif tag_type == 'GUEST':
195+ # datatye = 'virtualGuests'
196+ # elif tag_type == 'DEDICATED_HOST':
197+ # datatye = 'dedicatedHosts'
198+ # elif tag_type == 'HARDWARE':
199+ # datatye = 'hardware'
200+ # elif tag_type == 'TICKET':
201+ # datatye = 'openTickets'
202+ # elif tag_type == 'NETWORK_SUBNET':
203+ # datatye = 'subnets'
204+ # elif tag_type == 'NETWORK_VLAN':
205+ # datatye = 'networkVlans'
206+ # elif tag_type == 'NETWORK_VLAN_FIREWALL':
207+ # datatye = 'networkVlans'
208+ # elif tag_type == 'IMAGE_TEMPLATE':
209+ # datatye = 'blockDeviceTemplateGroups'
210+
211+ # return datatye
115212
116- # return {}
117- return self .client .call (service , 'getObject' , id = resource_table_id )
118-
119- def delete_tag (self , name ):
120- return self .client .call ('SoftLayer_Tag' , 'deleteTag' , name )
121-
122- def set_tags (self , tags , key_name , resource_id ):
123- """Calls SoftLayer_Tag::setTags()
124-
125- :param string tags: List of tags.
126- :param string key_name: Key name of a tag type.
127- :param int resource_id: ID of the object being tagged.
128- """
129- return self .client .call ('SoftLayer_Tag' , 'setTags' , tags , key_name , resource_id )
0 commit comments