16
16
// under the License.
17
17
package org .apache .cloudstack .hypervisor .xenserver ;
18
18
19
- import java .util .HashMap ;
20
19
import java .util .Map ;
21
20
22
21
import org .apache .log4j .Logger ;
23
22
import org .apache .xmlrpc .XmlRpcException ;
24
23
25
24
import com .cloud .exception .InvalidParameterValueException ;
25
+ import com .cloud .utils .Pair ;
26
26
import com .cloud .utils .exception .CloudRuntimeException ;
27
27
import com .xensource .xenapi .Connection ;
28
28
import com .xensource .xenapi .Types ;
@@ -35,16 +35,22 @@ public static void setExtraConfigurationToVm(Connection conn, VM.Record vmr, VM
35
35
Map <String , Object > recordMap = vmr .toMap ();
36
36
for (String key : extraConfig .keySet ()) {
37
37
String cfg = extraConfig .get (key );
38
- Map <String , String > configParams = prepareKeyValuePair (cfg );
38
+ // cfg is either param=value or map-param:key=value
39
+ Pair <String , String > configParam = prepareKeyValuePair (cfg );
40
+ if (configParam == null ) {
41
+ LOG .warn ("Invalid extra config passed: " + cfg );
42
+ continue ;
43
+ }
39
44
40
- // paramKey is either param or param:key for map parameters
41
- String paramKey = configParams . keySet (). toString (). replaceAll ( "[ \\ [ \\ ]]" , "" );
42
- String paramValue = configParams . get ( paramKey );
45
+ // paramKey is either param or map- param:key for map parameters
46
+ String paramKey = configParam . first ( );
47
+ String paramValue = configParam . second ( );
43
48
44
- //Map params
45
49
if (paramKey .contains (":" )) {
50
+ // Map params - paramKey is map-param:key
46
51
applyConfigWithNestedKeyValue (conn , vm , recordMap , paramKey , paramValue );
47
52
} else {
53
+ // Params - paramKey is param
48
54
applyConfigWithKeyValue (conn , vm , recordMap , paramKey , paramValue );
49
55
}
50
56
}
@@ -58,6 +64,7 @@ private static boolean isValidOperation(Map<String, Object> recordMap, String ac
58
64
* Nested keys contain ":" between the paramKey and need to split into operation param and key
59
65
* */
60
66
private static void applyConfigWithNestedKeyValue (Connection conn , VM vm , Map <String , Object > recordMap , String paramKey , String paramValue ) {
67
+ // paramKey is map-param:key
61
68
int i = paramKey .indexOf (":" );
62
69
String actualParam = paramKey .substring (0 , i );
63
70
String keyName = paramKey .substring (i + 1 );
@@ -68,12 +75,13 @@ private static void applyConfigWithNestedKeyValue(Connection conn, VM vm, Map<St
68
75
}
69
76
70
77
try {
78
+ // map-param param with '_'
71
79
switch (actualParam ) {
72
80
case "VCPUs_params" :
73
81
vm .addToVCPUsParams (conn , keyName , paramValue );
74
82
break ;
75
83
case "platform" :
76
- vm .addToOtherConfig (conn , keyName , paramValue );
84
+ vm .addToPlatform (conn , keyName , paramValue );
77
85
break ;
78
86
case "HVM_boot_params" :
79
87
vm .addToHVMBootParams (conn , keyName , paramValue );
@@ -101,6 +109,7 @@ private static void applyConfigWithKeyValue(Connection conn, VM vm, Map<String,
101
109
}
102
110
103
111
try {
112
+ // param with '_'
104
113
switch (paramKey ) {
105
114
case "HVM_boot_policy" :
106
115
vm .setHVMBootPolicy (conn , paramValue );
@@ -144,7 +153,7 @@ private static void applyConfigWithKeyValue(Connection conn, VM vm, Map<String,
144
153
case "VCPUs_at_startup" :
145
154
vm .setVCPUsAtStartup (conn , Long .valueOf (paramValue ));
146
155
break ;
147
- case "is-a-template " :
156
+ case "is_a_template " :
148
157
vm .setIsATemplate (conn , Boolean .valueOf (paramValue ));
149
158
break ;
150
159
case "memory_static_max" :
@@ -169,12 +178,28 @@ private static void applyConfigWithKeyValue(Connection conn, VM vm, Map<String,
169
178
}
170
179
}
171
180
172
- private static Map <String , String > prepareKeyValuePair (String cfg ) {
173
- Map < String , String > configKeyPair = new HashMap <>();
181
+ protected static Pair <String , String > prepareKeyValuePair (String cfg ) {
182
+ // cfg is either param=value or map-param:key=value
174
183
int indexOfEqualSign = cfg .indexOf ("=" );
175
- String key = cfg .substring (0 , indexOfEqualSign ).replace ("-" , "_" );
184
+ if (indexOfEqualSign <= 0 ) {
185
+ return null ;
186
+ }
187
+
188
+ String key ;
189
+ // Replace '-' with '_' in param / map-param only
190
+ if (cfg .contains (":" )) {
191
+ int indexOfColon = cfg .indexOf (":" );
192
+ if (indexOfColon <= 0 || indexOfEqualSign < indexOfColon ) {
193
+ return null ;
194
+ }
195
+ String mapParam = cfg .substring (0 , indexOfColon ).replace ("-" , "_" );
196
+ String paramKey = cfg .substring (indexOfColon + 1 , indexOfEqualSign );
197
+ key = mapParam + ":" + paramKey ;
198
+ } else {
199
+ key = cfg .substring (0 , indexOfEqualSign ).replace ("-" , "_" );
200
+ }
201
+
176
202
String value = cfg .substring (indexOfEqualSign + 1 );
177
- configKeyPair .put (key , value );
178
- return configKeyPair ;
203
+ return new Pair <>(key , value );
179
204
}
180
205
}
0 commit comments