1919import java .util .HashMap ;
2020import java .util .Map ;
2121
22+ import org .apache .log4j .Logger ;
23+ import org .apache .xmlrpc .XmlRpcException ;
24+
2225import com .cloud .exception .InvalidParameterValueException ;
2326import com .cloud .utils .exception .CloudRuntimeException ;
2427import com .xensource .xenapi .Connection ;
2528import com .xensource .xenapi .Types ;
2629import com .xensource .xenapi .VM ;
27- import org .apache .log4j .Logger ;
28- import org .apache .xmlrpc .XmlRpcException ;
2930
3031public class ExtraConfigurationUtility {
3132 private static final Logger LOG = Logger .getLogger (ExtraConfigurationUtility .class );
@@ -42,115 +43,9 @@ public static void setExtraConfigurationToVm(Connection conn, VM.Record vmr, VM
4243
4344 //Map params
4445 if (paramKey .contains (":" )) {
45- int i = paramKey .indexOf (":" );
46- String actualParam = paramKey .substring (0 , i );
47- String keyName = paramKey .substring (i + 1 );
48- boolean isValidOperation = isValidOperation (recordMap , actualParam );
49- if (isValidOperation ) {
50- try {
51- switch (actualParam ) {
52- case "VCPUs_params" :
53- vm .addToVCPUsParams (conn , keyName , paramValue );
54- break ;
55- case "platform" :
56- vm .addToOtherConfig (conn , keyName , paramValue );
57- break ;
58- case "HVM_boot_params" :
59- vm .addToHVMBootParams (conn , keyName , paramValue );
60- break ;
61- case "other_config" :
62- vm .addToOtherConfig (conn , keyName , paramValue );
63- break ;
64- case "xenstore_data" :
65- vm .addToXenstoreData (conn , keyName , paramValue );
66- break ;
67- default :
68- String msg = String .format ("Passed configuration %s is not supported" , paramKey );
69- LOG .warn (msg );
70- }
71- } catch (XmlRpcException | Types .XenAPIException e ) {
72- LOG .error ("Exception caught while setting VM configuration: " + cfg );
73- throw new CloudRuntimeException ("Exception caught while setting VM configuration: " + cfg , e );
74- }
75- } else {
76- LOG .error ("Unsupported extra configuration has been passed" );
77- throw new InvalidParameterValueException ("Unsupported extra configuration option has been passed: " + actualParam );
78- }
79-
46+ applyConfigWithNestedKeyValue (conn , vm , recordMap , paramKey , paramValue );
8047 } else {
81- boolean isValidOperation = isValidOperation (recordMap , paramKey );
82- if (isValidOperation ) {
83- try {
84- switch (paramKey ) {
85- case "HVM_boot_policy" :
86- vm .setHVMBootPolicy (conn , paramValue );
87- break ;
88- case "HVM_shadow_multiplier" :
89- vm .setHVMShadowMultiplier (conn , Double .valueOf (paramValue ));
90- break ;
91- case "PV_kernel" :
92- vm .setPVKernel (conn , paramValue );
93- break ;
94- case "PV_ramdisk" :
95- vm .setPVRamdisk (conn , paramValue );
96- break ;
97- case "PV_args" :
98- vm .setPVArgs (conn , paramValue );
99- break ;
100- case "PV_legacy_args" :
101- vm .setPVLegacyArgs (conn , paramValue );
102- break ;
103- case "PV_bootloader" :
104- vm .setPVBootloader (conn , paramValue );
105- break ;
106- case "PV_bootloader_args" :
107- vm .setPVBootloaderArgs (conn , paramValue );
108- break ;
109- case "ha_restart_priority" :
110- vm .setHaRestartPriority (conn , paramValue );
111- break ;
112- case "start_delay" :
113- vm .setStartDelay (conn , Long .valueOf (paramValue ));
114- break ;
115- case "shutdown_delay" :
116- vm .setShutdownDelay (conn , Long .valueOf (paramValue ));
117- break ;
118- case "order" :
119- vm .setOrder (conn , Long .valueOf (paramValue ));
120- break ;
121- case "VCPUs_max" :
122- vm .setVCPUsMax (conn , Long .valueOf (paramValue ));
123- break ;
124- case "VCPUs_at_startup" :
125- vm .setVCPUsAtStartup (conn , Long .valueOf (paramValue ));
126- break ;
127- case "is-a-template" :
128- vm .setIsATemplate (conn , Boolean .valueOf (paramValue ));
129- break ;
130- case "memory_static_max" :
131- vm .setMemoryStaticMax (conn , Long .valueOf (paramValue ));
132- break ;
133- case "memory_static_min" :
134- vm .setMemoryStaticMin (conn , Long .valueOf (paramValue ));
135- break ;
136- case "memory_dynamic_max" :
137- vm .setMemoryDynamicMax (conn , Long .valueOf (paramValue ));
138- break ;
139- case "memory_dynamic_min" :
140- vm .setMemoryDynamicMin (conn , Long .valueOf (paramValue ));
141- break ;
142- default :
143- String anotherMessage = String .format ("Passed configuration %s is not supported" , paramKey );
144- LOG .error (anotherMessage );
145- }
146- } catch (XmlRpcException | Types .XenAPIException e ) {
147- LOG .error ("Exception caught while setting VM configuration" );
148- throw new CloudRuntimeException ("Exception caught while setting VM configuration: " + cfg , e );
149- }
150- } else {
151- LOG .error ("Unsupported extra configuration has been passed: " + paramKey );
152- throw new InvalidParameterValueException ("Unsupported extra configuration parameter key has been passed: " + paramKey );
153- }
48+ applyConfigWithKeyValue (conn , vm , recordMap , paramKey , paramValue );
15449 }
15550 }
15651 }
@@ -159,6 +54,121 @@ private static boolean isValidOperation(Map<String, Object> recordMap, String ac
15954 return recordMap .containsKey (actualParam );
16055 }
16156
57+ /**
58+ * Nested keys contain ":" between the paramKey and need to split into operation param and key
59+ * */
60+ private static void applyConfigWithNestedKeyValue (Connection conn , VM vm , Map <String , Object > recordMap , String paramKey , String paramValue ) {
61+ int i = paramKey .indexOf (":" );
62+ String actualParam = paramKey .substring (0 , i );
63+ String keyName = paramKey .substring (i + 1 );
64+
65+ if (!isValidOperation (recordMap , actualParam )) {
66+ LOG .error ("Unsupported extra configuration has been passed " + actualParam );
67+ throw new InvalidParameterValueException ("Unsupported extra configuration option has been passed: " + actualParam );
68+ }
69+
70+ try {
71+ switch (actualParam ) {
72+ case "VCPUs_params" :
73+ vm .addToVCPUsParams (conn , keyName , paramValue );
74+ break ;
75+ case "platform" :
76+ vm .addToOtherConfig (conn , keyName , paramValue );
77+ break ;
78+ case "HVM_boot_params" :
79+ vm .addToHVMBootParams (conn , keyName , paramValue );
80+ break ;
81+ case "other_config" :
82+ vm .addToOtherConfig (conn , keyName , paramValue );
83+ break ;
84+ case "xenstore_data" :
85+ vm .addToXenstoreData (conn , keyName , paramValue );
86+ break ;
87+ default :
88+ String msg = String .format ("Passed configuration %s is not supported" , paramKey );
89+ LOG .warn (msg );
90+ }
91+ } catch (XmlRpcException | Types .XenAPIException e ) {
92+ LOG .error ("Exception caught while setting VM configuration. exception: " + e .getMessage ());
93+ throw new CloudRuntimeException ("Exception caught while setting VM configuration" , e );
94+ }
95+ }
96+
97+ private static void applyConfigWithKeyValue (Connection conn , VM vm , Map <String , Object > recordMap , String paramKey , String paramValue ) {
98+ if (!isValidOperation (recordMap , paramKey )) {
99+ LOG .error ("Unsupported extra configuration has been passed: " + paramKey );
100+ throw new InvalidParameterValueException ("Unsupported extra configuration parameter key has been passed: " + paramKey );
101+ }
102+
103+ try {
104+ switch (paramKey ) {
105+ case "HVM_boot_policy" :
106+ vm .setHVMBootPolicy (conn , paramValue );
107+ break ;
108+ case "HVM_shadow_multiplier" :
109+ vm .setHVMShadowMultiplier (conn , Double .valueOf (paramValue ));
110+ break ;
111+ case "PV_kernel" :
112+ vm .setPVKernel (conn , paramValue );
113+ break ;
114+ case "PV_ramdisk" :
115+ vm .setPVRamdisk (conn , paramValue );
116+ break ;
117+ case "PV_args" :
118+ vm .setPVArgs (conn , paramValue );
119+ break ;
120+ case "PV_legacy_args" :
121+ vm .setPVLegacyArgs (conn , paramValue );
122+ break ;
123+ case "PV_bootloader" :
124+ vm .setPVBootloader (conn , paramValue );
125+ break ;
126+ case "PV_bootloader_args" :
127+ vm .setPVBootloaderArgs (conn , paramValue );
128+ break ;
129+ case "ha_restart_priority" :
130+ vm .setHaRestartPriority (conn , paramValue );
131+ break ;
132+ case "start_delay" :
133+ vm .setStartDelay (conn , Long .valueOf (paramValue ));
134+ break ;
135+ case "shutdown_delay" :
136+ vm .setShutdownDelay (conn , Long .valueOf (paramValue ));
137+ break ;
138+ case "order" :
139+ vm .setOrder (conn , Long .valueOf (paramValue ));
140+ break ;
141+ case "VCPUs_max" :
142+ vm .setVCPUsMax (conn , Long .valueOf (paramValue ));
143+ break ;
144+ case "VCPUs_at_startup" :
145+ vm .setVCPUsAtStartup (conn , Long .valueOf (paramValue ));
146+ break ;
147+ case "is-a-template" :
148+ vm .setIsATemplate (conn , Boolean .valueOf (paramValue ));
149+ break ;
150+ case "memory_static_max" :
151+ vm .setMemoryStaticMax (conn , Long .valueOf (paramValue ));
152+ break ;
153+ case "memory_static_min" :
154+ vm .setMemoryStaticMin (conn , Long .valueOf (paramValue ));
155+ break ;
156+ case "memory_dynamic_max" :
157+ vm .setMemoryDynamicMax (conn , Long .valueOf (paramValue ));
158+ break ;
159+ case "memory_dynamic_min" :
160+ vm .setMemoryDynamicMin (conn , Long .valueOf (paramValue ));
161+ break ;
162+ default :
163+ String anotherMessage = String .format ("Passed configuration %s is not supported" , paramKey );
164+ LOG .error (anotherMessage );
165+ }
166+ } catch (XmlRpcException | Types .XenAPIException e ) {
167+ LOG .error ("Exception caught while setting VM configuration, exception: " + e .getMessage ());
168+ throw new CloudRuntimeException ("Exception caught while setting VM configuration: " , e );
169+ }
170+ }
171+
162172 private static Map <String , String > prepareKeyValuePair (String cfg ) {
163173 Map <String , String > configKeyPair = new HashMap <>();
164174 int indexOfEqualSign = cfg .indexOf ("=" );
0 commit comments