PageRenderTime 26ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/src/ServiceManagement/Compute/Commands.ServiceManagement/IaaS/Extensions/Common/VirtualMachineExtensionCmdletBase.cs

https://gitlab.com/jslee1/azure-powershell
C# | 365 lines | 303 code | 48 blank | 14 comment | 45 complexity | f9ead05a0773648ddbc01f9e4701e1b6 MD5 | raw file
  1. // ----------------------------------------------------------------------------------
  2. //
  3. // Copyright Microsoft Corporation
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. // ----------------------------------------------------------------------------------
  14. using Microsoft.Azure.Commands.Common.Authentication;
  15. using Microsoft.WindowsAzure.Commands.ServiceManagement.Helpers;
  16. using Microsoft.WindowsAzure.Commands.ServiceManagement.Model;
  17. using Microsoft.WindowsAzure.Commands.ServiceManagement.Properties;
  18. using Newtonsoft.Json.Linq;
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Linq;
  22. using System.Management.Automation;
  23. using System.Xml.Linq;
  24. namespace Microsoft.WindowsAzure.Commands.ServiceManagement.IaaS.Extensions
  25. {
  26. public class VirtualMachineExtensionCmdletBase : VirtualMachineConfigurationCmdletBase
  27. {
  28. protected const string PublicConfigurationKeyStr = "PublicConfiguration";
  29. protected const string PrivateConfigurationKeyStr = "PrivateConfiguration";
  30. protected const string PublicTypeStr = "Public";
  31. protected const string PrivateTypeStr = "Private";
  32. public const string ReferenceDisableStateStr = "Disable";
  33. public const string ReferenceEnableStateStr = "Enable";
  34. public const string ReferenceUninstallStateStr = "Uninstall";
  35. protected static VirtualMachineExtensionImageContext[] LegacyExtensionImages;
  36. protected string extensionName;
  37. protected string publisherName;
  38. public virtual string ExtensionName
  39. {
  40. get
  41. {
  42. return extensionName;
  43. }
  44. set
  45. {
  46. extensionName = value;
  47. }
  48. }
  49. public virtual string Publisher
  50. {
  51. get
  52. {
  53. return publisherName;
  54. }
  55. set
  56. {
  57. publisherName = value;
  58. }
  59. }
  60. public virtual string Version { get; set; }
  61. public virtual string ReferenceName { get; set; }
  62. public virtual string PublicConfigKey { get; set; }
  63. public virtual string PrivateConfigKey { get; set; }
  64. public virtual string PublicConfiguration { get; set; }
  65. public virtual string PrivateConfiguration { get; set; }
  66. public virtual string PublicConfigPath { get; set; }
  67. public virtual string PrivateConfigPath { get; set; }
  68. public virtual SwitchParameter Disable { get; set; }
  69. public virtual SwitchParameter Uninstall { get; set; }
  70. public virtual SwitchParameter ForceUpdate { get; set; }
  71. static VirtualMachineExtensionCmdletBase()
  72. {
  73. LegacyExtensionImages = new VirtualMachineExtensionImageContext[2]
  74. {
  75. new VirtualMachineExtensionImageContext
  76. {
  77. ExtensionName = "VMAccessAgent",
  78. Publisher = "Microsoft.Compute",
  79. Version = "0.1"
  80. },
  81. new VirtualMachineExtensionImageContext
  82. {
  83. ExtensionName = "DiagnosticsAgent",
  84. Publisher = "Microsoft.Compute",
  85. Version = "0.1"
  86. }
  87. };
  88. }
  89. protected bool IsLegacyExtension()
  90. {
  91. return IsLegacyExtension(this.ExtensionName, this.Publisher, this.Version);
  92. }
  93. protected bool IsLegacyExtension(string name, string publisher, string version)
  94. {
  95. Func<string, string, bool> eq =
  96. (x, y) => string.Equals(x, y, StringComparison.OrdinalIgnoreCase);
  97. return LegacyExtensionImages == null ? false
  98. : LegacyExtensionImages.Any(r => eq(r.ExtensionName, name)
  99. && eq(r.Publisher, publisher)
  100. && eq(r.Version, version));
  101. }
  102. protected bool IsXmlExtension(string version)
  103. {
  104. if (string.IsNullOrEmpty(version))
  105. {
  106. return false;
  107. }
  108. return version.StartsWith("1");
  109. }
  110. protected ResourceExtensionReferenceList ResourceExtensionReferences
  111. {
  112. get
  113. {
  114. if (VM.GetInstance().ResourceExtensionReferences == null)
  115. {
  116. VM.GetInstance().ResourceExtensionReferences = new ResourceExtensionReferenceList();
  117. }
  118. return VM.GetInstance().ResourceExtensionReferences;
  119. }
  120. }
  121. protected Func<ResourceExtensionReference, bool> ExtensionPredicate
  122. {
  123. get
  124. {
  125. Func<string, string, bool> eq =
  126. (x, y) => string.Equals(x, y, StringComparison.OrdinalIgnoreCase);
  127. return string.IsNullOrEmpty(this.ExtensionName) ?
  128. (Func<ResourceExtensionReference, bool>)
  129. (r => eq(r.ReferenceName, this.ReferenceName))
  130. : (r => eq(r.Name, this.ExtensionName)
  131. && eq(r.Publisher, this.Publisher));
  132. }
  133. }
  134. protected List<ResourceExtensionReference> GetPredicateExtensionList()
  135. {
  136. List<ResourceExtensionReference> extensionRefs = null;
  137. if (!ResourceExtensionReferences.Any())
  138. {
  139. WriteWarning(Resources.ResourceExtensionReferencesIsNullOrEmpty);
  140. return extensionRefs;
  141. }
  142. extensionRefs = ResourceExtensionReferences.FindAll(
  143. r => ExtensionPredicate(r));
  144. if (!extensionRefs.Any())
  145. {
  146. WriteWarning(Resources.ResourceExtensionReferenceCannotBeFound);
  147. }
  148. return extensionRefs;
  149. }
  150. protected ResourceExtensionReference GetPredicateExtension()
  151. {
  152. ResourceExtensionReference extensionRef = null;
  153. if (!ResourceExtensionReferences.Any())
  154. {
  155. WriteWarning(Resources.ResourceExtensionReferencesIsNullOrEmpty);
  156. }
  157. else
  158. {
  159. extensionRef = ResourceExtensionReferences.FirstOrDefault(ExtensionPredicate);
  160. }
  161. return extensionRef;
  162. }
  163. protected void AddResourceExtension()
  164. {
  165. ResourceExtensionReferences.Add(NewResourceExtension());
  166. }
  167. protected void RemovePredicateExtensions()
  168. {
  169. ResourceExtensionReferences.RemoveAll(r => ExtensionPredicate(r));
  170. }
  171. protected ResourceExtensionReference NewResourceExtension()
  172. {
  173. var extensionRef = new ResourceExtensionReference();
  174. extensionRef.Name = this.ExtensionName;
  175. extensionRef.Publisher = this.Publisher;
  176. extensionRef.Version = this.Version;
  177. extensionRef.State = IsLegacyExtension() ? null :
  178. this.Uninstall.IsPresent ? ReferenceUninstallStateStr :
  179. this.Disable.IsPresent ? ReferenceDisableStateStr : ReferenceEnableStateStr;
  180. extensionRef.ResourceExtensionParameterValues = new ResourceExtensionParameterValueList();
  181. if (!string.IsNullOrEmpty(this.ReferenceName))
  182. {
  183. extensionRef.ReferenceName = this.ReferenceName;
  184. }
  185. else
  186. {
  187. extensionRef.ReferenceName = extensionRef.Name;
  188. }
  189. if (!string.IsNullOrEmpty(this.PublicConfigPath))
  190. {
  191. this.PublicConfiguration = FileUtilities.DataStore.ReadFileAsText(this.PublicConfigPath);
  192. }
  193. if (!string.IsNullOrEmpty(this.PublicConfiguration))
  194. {
  195. extensionRef.ResourceExtensionParameterValues.Add(
  196. new ResourceExtensionParameterValue
  197. {
  198. Key = !string.IsNullOrEmpty(this.PublicConfigKey) ? this.PublicConfigKey
  199. : ExtensionName + (IsLegacyExtension() ? string.Empty : PublicTypeStr) + "ConfigParameter",
  200. Type = IsLegacyExtension() ? null : PublicTypeStr,
  201. Value = PublicConfiguration
  202. });
  203. }
  204. if (!string.IsNullOrEmpty(this.PrivateConfigPath))
  205. {
  206. this.PrivateConfiguration = FileUtilities.DataStore.ReadFileAsText(this.PrivateConfigPath);
  207. }
  208. if (!string.IsNullOrEmpty(this.PrivateConfiguration))
  209. {
  210. extensionRef.ResourceExtensionParameterValues.Add(
  211. new ResourceExtensionParameterValue
  212. {
  213. Key = !string.IsNullOrEmpty(this.PrivateConfigKey) ? this.PrivateConfigKey
  214. : ExtensionName + (IsLegacyExtension() ? string.Empty : PrivateTypeStr) + "ConfigParameter",
  215. Type = IsLegacyExtension() ? null : PrivateTypeStr,
  216. SecureValue = SecureStringHelper.GetSecureString(PrivateConfiguration)
  217. });
  218. }
  219. if (this.ForceUpdate.IsPresent)
  220. {
  221. extensionRef.ForceUpdate = true;
  222. }
  223. return extensionRef;
  224. }
  225. protected string GetConfiguration(
  226. ResourceExtensionParameterValueList paramValList,
  227. string typeStr)
  228. {
  229. string config = string.Empty;
  230. if (paramValList != null && paramValList.Any())
  231. {
  232. var paramVal = paramValList.FirstOrDefault(
  233. p => string.IsNullOrEmpty(typeStr) ? true :
  234. string.Equals(p.Type, typeStr, StringComparison.OrdinalIgnoreCase));
  235. config = SecureStringHelper.GetPlainString(paramVal);
  236. }
  237. return config;
  238. }
  239. protected string GetConfiguration(
  240. ResourceExtensionReference extensionRef)
  241. {
  242. return extensionRef == null ? string.Empty : GetConfiguration(
  243. extensionRef.ResourceExtensionParameterValues, null);
  244. }
  245. protected string GetConfiguration(
  246. ResourceExtensionReference extensionRef,
  247. string typeStr)
  248. {
  249. return extensionRef == null ? string.Empty : GetConfiguration(
  250. extensionRef.ResourceExtensionParameterValues,
  251. typeStr);
  252. }
  253. protected virtual void ValidateParameters()
  254. {
  255. // GA must be enabled before setting extensions
  256. if (VM.GetInstance().ProvisionGuestAgent != null && !VM.GetInstance().ProvisionGuestAgent.Value)
  257. {
  258. throw new ArgumentException(Resources.ProvisionGuestAgentMustBeEnabledBeforeSettingIaaSVMAccessExtension);
  259. }
  260. if (string.IsNullOrEmpty(this.ReferenceName))
  261. {
  262. var extensionRef = GetPredicateExtension();
  263. if (extensionRef != null)
  264. {
  265. this.ReferenceName = extensionRef.ReferenceName;
  266. }
  267. }
  268. }
  269. protected virtual void GetExtensionValues(ResourceExtensionReference extensionRef)
  270. {
  271. if (extensionRef != null && extensionRef.ResourceExtensionParameterValues != null)
  272. {
  273. Disable = string.Equals(extensionRef.State, ReferenceDisableStateStr);
  274. GetExtensionValues(extensionRef.ResourceExtensionParameterValues);
  275. }
  276. else
  277. {
  278. Disable = extensionRef == null ? true : string.Equals(extensionRef.State, ReferenceDisableStateStr);
  279. }
  280. }
  281. protected virtual void GetExtensionValues(ResourceExtensionParameterValueList paramVals)
  282. {
  283. if (paramVals != null && paramVals.Any())
  284. {
  285. var publicParamVal = paramVals.FirstOrDefault(
  286. r => !string.IsNullOrEmpty(r.Value) && string.Equals(r.Type, PublicTypeStr));
  287. if (publicParamVal != null && !string.IsNullOrEmpty(publicParamVal.Value))
  288. {
  289. this.PublicConfiguration = publicParamVal.Value;
  290. }
  291. var privateParamVal = paramVals.FirstOrDefault(
  292. r => !string.IsNullOrEmpty(r.Value) && string.Equals(r.Type, PrivateTypeStr));
  293. if (privateParamVal != null && !string.IsNullOrEmpty(privateParamVal.Value))
  294. {
  295. this.PrivateConfiguration = privateParamVal.Value;
  296. }
  297. }
  298. }
  299. protected static string GetConfigValue(string xmlText, string element)
  300. {
  301. XDocument config = XDocument.Parse(xmlText);
  302. var result = from d in config.Descendants()
  303. where d.Name.LocalName == element
  304. select d.Descendants().Any() ? d.ToString() : d.Value;
  305. return result.FirstOrDefault();
  306. }
  307. protected static string GetJsonConfigValue(string jsonText, string element)
  308. {
  309. if (string.IsNullOrEmpty(jsonText))
  310. {
  311. return null;
  312. }
  313. var jsonObject = JObject.Parse(jsonText);
  314. return jsonObject[element].Value<string>();
  315. }
  316. }
  317. }