From b93a61673d2a7fd1a563d540ff8854cfcc5b5d02 Mon Sep 17 00:00:00 2001 From: Konstantina Chremmou Date: Tue, 11 Apr 2023 15:41:28 +0100 Subject: [PATCH 1/4] Updated SDK to v23.10.0. Signed-off-by: Konstantina Chremmou --- .../XenAPI/FriendlyErrorNames.Designer.cs | 13 +- XenModel/XenAPI/FriendlyErrorNames.resx | 5 +- XenModel/XenAPI/JsonRpcClient.cs | 70 +++++++ XenModel/XenAPI/Maps.cs | 46 +++++ XenModel/XenAPI/Pool.cs | 194 +++++++++++++++++- XenModel/XenAPI/VTPM.cs | 74 ++++++- XenModel/XenAPI/domain_type.cs | 6 + XenModel/XenAPI/telemetry_frequency.cs | 86 ++++++++ XenModel/XenAPI/vm_operations.cs | 6 + XenModel/XenAPI/vtpm_operations.cs | 74 +++++++ XenModel/XenModel.csproj | 2 + 11 files changed, 570 insertions(+), 6 deletions(-) create mode 100644 XenModel/XenAPI/telemetry_frequency.cs create mode 100644 XenModel/XenAPI/vtpm_operations.cs diff --git a/XenModel/XenAPI/FriendlyErrorNames.Designer.cs b/XenModel/XenAPI/FriendlyErrorNames.Designer.cs index 02ed86869..3ff76a866 100755 --- a/XenModel/XenAPI/FriendlyErrorNames.Designer.cs +++ b/XenModel/XenAPI/FriendlyErrorNames.Designer.cs @@ -19,7 +19,7 @@ namespace XenAPI { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FriendlyErrorNames { @@ -1969,7 +1969,7 @@ namespace XenAPI { } /// - /// Looks up a localized string similar to The dynamic memory range violates constraint static_min <= dynamic_min = dynamic_max = static_max.. + /// Looks up a localized string similar to The dynamic memory range violates constraint static_min = dynamic_min = dynamic_max = static_max.. /// public static string MEMORY_CONSTRAINT_VIOLATION_MAXPIN { get { @@ -5375,6 +5375,15 @@ namespace XenAPI { } } + /// + /// Looks up a localized string similar to The next scheduled telemetry data collection is too far into the future. Pick a timestamp within two telemetry intervals starting from now.. + /// + public static string TELEMETRY_NEXT_COLLECTION_TOO_LATE { + get { + return ResourceManager.GetString("TELEMETRY_NEXT_COLLECTION_TOO_LATE", resourceCulture); + } + } + /// /// Looks up a localized string similar to Cannot contact the other host using TLS on the specified address and port. /// diff --git a/XenModel/XenAPI/FriendlyErrorNames.resx b/XenModel/XenAPI/FriendlyErrorNames.resx index 7ab17cdb0..3695aaa6f 100755 --- a/XenModel/XenAPI/FriendlyErrorNames.resx +++ b/XenModel/XenAPI/FriendlyErrorNames.resx @@ -748,7 +748,7 @@ The dynamic memory range does not satisfy the following constraint. - The dynamic memory range violates constraint static_min <= dynamic_min = dynamic_max = static_max. + The dynamic memory range violates constraint static_min = dynamic_min = dynamic_max = static_max. The dynamic memory range violates constraint static_min <= dynamic_min <= dynamic_max <= static_max. @@ -1892,6 +1892,9 @@ Authorized Roles: {1} The request was asynchronously canceled. + + The next scheduled telemetry data collection is too far into the future. Pick a timestamp within two telemetry intervals starting from now. + Cannot contact the other host using TLS on the specified address and port diff --git a/XenModel/XenAPI/JsonRpcClient.cs b/XenModel/XenAPI/JsonRpcClient.cs index 21812b69e..7f7990fe1 100755 --- a/XenModel/XenAPI/JsonRpcClient.cs +++ b/XenModel/XenAPI/JsonRpcClient.cs @@ -1116,6 +1116,13 @@ namespace XenAPI return Rpc("pool.get_repository_proxy_username", new JArray(session, _pool ?? ""), serializer); } + public XenRef pool_get_repository_proxy_password(string session, string _pool) + { + var converters = new List {new XenRefConverter()}; + var serializer = CreateSerializer(converters); + return Rpc>("pool.get_repository_proxy_password", new JArray(session, _pool ?? ""), serializer); + } + public bool pool_get_migration_compression(string session, string _pool) { var converters = new List {}; @@ -1130,6 +1137,27 @@ namespace XenAPI return Rpc("pool.get_coordinator_bias", new JArray(session, _pool ?? ""), serializer); } + public XenRef pool_get_telemetry_uuid(string session, string _pool) + { + var converters = new List {new XenRefConverter()}; + var serializer = CreateSerializer(converters); + return Rpc>("pool.get_telemetry_uuid", new JArray(session, _pool ?? ""), serializer); + } + + public telemetry_frequency pool_get_telemetry_frequency(string session, string _pool) + { + var converters = new List {new telemetry_frequencyConverter()}; + var serializer = CreateSerializer(converters); + return Rpc("pool.get_telemetry_frequency", new JArray(session, _pool ?? ""), serializer); + } + + public DateTime pool_get_telemetry_next_collection(string session, string _pool) + { + var converters = new List {new XenDateTimeConverter()}; + var serializer = CreateSerializer(converters); + return Rpc("pool.get_telemetry_next_collection", new JArray(session, _pool ?? ""), serializer); + } + public void pool_set_name_label(string session, string _pool, string _name_label) { var converters = new List {}; @@ -2145,6 +2173,34 @@ namespace XenAPI return Rpc>("Async.pool.set_https_only", new JArray(session, _pool ?? "", _value), serializer); } + public void pool_set_telemetry_next_collection(string session, string _pool, DateTime _value) + { + var converters = new List {new XenDateTimeConverter()}; + var serializer = CreateSerializer(converters); + Rpc("pool.set_telemetry_next_collection", new JArray(session, _pool ?? "", _value), serializer); + } + + public XenRef async_pool_set_telemetry_next_collection(string session, string _pool, DateTime _value) + { + var converters = new List {new XenRefConverter(), new XenDateTimeConverter()}; + var serializer = CreateSerializer(converters); + return Rpc>("Async.pool.set_telemetry_next_collection", new JArray(session, _pool ?? "", _value), serializer); + } + + public void pool_reset_telemetry_uuid(string session, string _pool) + { + var converters = new List {}; + var serializer = CreateSerializer(converters); + Rpc("pool.reset_telemetry_uuid", new JArray(session, _pool ?? ""), serializer); + } + + public XenRef async_pool_reset_telemetry_uuid(string session, string _pool) + { + var converters = new List {new XenRefConverter()}; + var serializer = CreateSerializer(converters); + return Rpc>("Async.pool.reset_telemetry_uuid", new JArray(session, _pool ?? ""), serializer); + } + public List> pool_get_all(string session) { var converters = new List {new XenRefListConverter()}; @@ -11938,6 +11994,20 @@ namespace XenAPI return Rpc("VTPM.get_uuid", new JArray(session, _vtpm ?? ""), serializer); } + public List vtpm_get_allowed_operations(string session, string _vtpm) + { + var converters = new List {}; + var serializer = CreateSerializer(converters); + return Rpc>("VTPM.get_allowed_operations", new JArray(session, _vtpm ?? ""), serializer); + } + + public Dictionary vtpm_get_current_operations(string session, string _vtpm) + { + var converters = new List {}; + var serializer = CreateSerializer(converters); + return Rpc>("VTPM.get_current_operations", new JArray(session, _vtpm ?? ""), serializer); + } + public XenRef vtpm_get_vm(string session, string _vtpm) { var converters = new List {new XenRefConverter()}; diff --git a/XenModel/XenAPI/Maps.cs b/XenModel/XenAPI/Maps.cs index 0cb009938..a1f0b899a 100644 --- a/XenModel/XenAPI/Maps.cs +++ b/XenModel/XenAPI/Maps.cs @@ -680,6 +680,52 @@ using System.Collections.Generic; } + internal static Dictionary convert_from_proxy_string_vtpm_operations(Object o) + { + Hashtable table = (Hashtable)o; + Dictionary result = new Dictionary(); + if (table != null) + { + foreach (string key in table.Keys) + { + try + { + string k = key; + vtpm_operations v = table[key] == null ? (vtpm_operations) 0 : (vtpm_operations)Helper.EnumParseDefault(typeof(vtpm_operations), (string)table[key]); + result[k] = v; + } + catch + { + // continue + } + } + } + return result; + } + + internal static Hashtable convert_to_proxy_string_vtpm_operations(Dictionary table) + { + var result = new Hashtable(); + if (table != null) + { + foreach (string key in table.Keys) + { + try + { + string k = key ?? ""; + string v = vtpm_operations_helper.ToString(table[key]); + result[k] = v; + } + catch + { + // continue + } + } + } + return result; + } + + internal static Dictionary convert_from_proxy_string_vusb_operations(Object o) { Hashtable table = (Hashtable)o; diff --git a/XenModel/XenAPI/Pool.cs b/XenModel/XenAPI/Pool.cs index d256c5220..a1c7c4ad9 100644 --- a/XenModel/XenAPI/Pool.cs +++ b/XenModel/XenAPI/Pool.cs @@ -95,8 +95,12 @@ namespace XenAPI string client_certificate_auth_name, string repository_proxy_url, string repository_proxy_username, + XenRef repository_proxy_password, bool migration_compression, - bool coordinator_bias) + bool coordinator_bias, + XenRef telemetry_uuid, + telemetry_frequency telemetry_frequency, + DateTime telemetry_next_collection) { this.uuid = uuid; this.name_label = name_label; @@ -142,8 +146,12 @@ namespace XenAPI this.client_certificate_auth_name = client_certificate_auth_name; this.repository_proxy_url = repository_proxy_url; this.repository_proxy_username = repository_proxy_username; + this.repository_proxy_password = repository_proxy_password; this.migration_compression = migration_compression; this.coordinator_bias = coordinator_bias; + this.telemetry_uuid = telemetry_uuid; + this.telemetry_frequency = telemetry_frequency; + this.telemetry_next_collection = telemetry_next_collection; } /// @@ -210,8 +218,12 @@ namespace XenAPI client_certificate_auth_name = record.client_certificate_auth_name; repository_proxy_url = record.repository_proxy_url; repository_proxy_username = record.repository_proxy_username; + repository_proxy_password = record.repository_proxy_password; migration_compression = record.migration_compression; coordinator_bias = record.coordinator_bias; + telemetry_uuid = record.telemetry_uuid; + telemetry_frequency = record.telemetry_frequency; + telemetry_next_collection = record.telemetry_next_collection; } /// @@ -310,10 +322,18 @@ namespace XenAPI repository_proxy_url = Marshalling.ParseString(table, "repository_proxy_url"); if (table.ContainsKey("repository_proxy_username")) repository_proxy_username = Marshalling.ParseString(table, "repository_proxy_username"); + if (table.ContainsKey("repository_proxy_password")) + repository_proxy_password = Marshalling.ParseRef(table, "repository_proxy_password"); if (table.ContainsKey("migration_compression")) migration_compression = Marshalling.ParseBool(table, "migration_compression"); if (table.ContainsKey("coordinator_bias")) coordinator_bias = Marshalling.ParseBool(table, "coordinator_bias"); + if (table.ContainsKey("telemetry_uuid")) + telemetry_uuid = Marshalling.ParseRef(table, "telemetry_uuid"); + if (table.ContainsKey("telemetry_frequency")) + telemetry_frequency = (telemetry_frequency)Helper.EnumParseDefault(typeof(telemetry_frequency), Marshalling.ParseString(table, "telemetry_frequency")); + if (table.ContainsKey("telemetry_next_collection")) + telemetry_next_collection = Marshalling.ParseDateTime(table, "telemetry_next_collection"); } public bool DeepEquals(Pool other, bool ignoreCurrentOperations) @@ -369,8 +389,12 @@ namespace XenAPI Helper.AreEqual2(this._client_certificate_auth_name, other._client_certificate_auth_name) && Helper.AreEqual2(this._repository_proxy_url, other._repository_proxy_url) && Helper.AreEqual2(this._repository_proxy_username, other._repository_proxy_username) && + Helper.AreEqual2(this._repository_proxy_password, other._repository_proxy_password) && Helper.AreEqual2(this._migration_compression, other._migration_compression) && - Helper.AreEqual2(this._coordinator_bias, other._coordinator_bias); + Helper.AreEqual2(this._coordinator_bias, other._coordinator_bias) && + Helper.AreEqual2(this._telemetry_uuid, other._telemetry_uuid) && + Helper.AreEqual2(this._telemetry_frequency, other._telemetry_frequency) && + Helper.AreEqual2(this._telemetry_next_collection, other._telemetry_next_collection); } public override string SaveChanges(Session session, string opaqueRef, Pool server) @@ -969,6 +993,17 @@ namespace XenAPI return session.JsonRpcClient.pool_get_repository_proxy_username(session.opaque_ref, _pool); } + /// + /// Get the repository_proxy_password field of the given pool. + /// First published in 21.3.0. + /// + /// The session + /// The opaque_ref of the given pool + public static XenRef get_repository_proxy_password(Session session, string _pool) + { + return session.JsonRpcClient.pool_get_repository_proxy_password(session.opaque_ref, _pool); + } + /// /// Get the migration_compression field of the given pool. /// Experimental. First published in 22.33.0. @@ -991,6 +1026,39 @@ namespace XenAPI return session.JsonRpcClient.pool_get_coordinator_bias(session.opaque_ref, _pool); } + /// + /// Get the telemetry_uuid field of the given pool. + /// Experimental. First published in 23.9.0. + /// + /// The session + /// The opaque_ref of the given pool + public static XenRef get_telemetry_uuid(Session session, string _pool) + { + return session.JsonRpcClient.pool_get_telemetry_uuid(session.opaque_ref, _pool); + } + + /// + /// Get the telemetry_frequency field of the given pool. + /// Experimental. First published in 23.9.0. + /// + /// The session + /// The opaque_ref of the given pool + public static telemetry_frequency get_telemetry_frequency(Session session, string _pool) + { + return session.JsonRpcClient.pool_get_telemetry_frequency(session.opaque_ref, _pool); + } + + /// + /// Get the telemetry_next_collection field of the given pool. + /// Experimental. First published in 23.9.0. + /// + /// The session + /// The opaque_ref of the given pool + public static DateTime get_telemetry_next_collection(Session session, string _pool) + { + return session.JsonRpcClient.pool_get_telemetry_next_collection(session.opaque_ref, _pool); + } + /// /// Set the name_label field of the given pool. /// First published in XenServer 4.0. @@ -2707,6 +2775,52 @@ namespace XenAPI return session.JsonRpcClient.async_pool_set_https_only(session.opaque_ref, _pool, _value); } + /// + /// Set the timestamp for the next telemetry data collection. + /// Experimental. First published in 23.9.0. + /// + /// The session + /// The opaque_ref of the given pool + /// The earliest timestamp (in UTC) when the next round of telemetry collection can be carried out. + public static void set_telemetry_next_collection(Session session, string _pool, DateTime _value) + { + session.JsonRpcClient.pool_set_telemetry_next_collection(session.opaque_ref, _pool, _value); + } + + /// + /// Set the timestamp for the next telemetry data collection. + /// Experimental. First published in 23.9.0. + /// + /// The session + /// The opaque_ref of the given pool + /// The earliest timestamp (in UTC) when the next round of telemetry collection can be carried out. + public static XenRef async_set_telemetry_next_collection(Session session, string _pool, DateTime _value) + { + return session.JsonRpcClient.async_pool_set_telemetry_next_collection(session.opaque_ref, _pool, _value); + } + + /// + /// Assign a new UUID to telemetry data. + /// Experimental. First published in 23.9.0. + /// + /// The session + /// The opaque_ref of the given pool + public static void reset_telemetry_uuid(Session session, string _pool) + { + session.JsonRpcClient.pool_reset_telemetry_uuid(session.opaque_ref, _pool); + } + + /// + /// Assign a new UUID to telemetry data. + /// Experimental. First published in 23.9.0. + /// + /// The session + /// The opaque_ref of the given pool + public static XenRef async_reset_telemetry_uuid(Session session, string _pool) + { + return session.JsonRpcClient.async_pool_reset_telemetry_uuid(session.opaque_ref, _pool); + } + /// /// Return a list of all the pools known to the system. /// First published in XenServer 4.0. @@ -3524,6 +3638,25 @@ namespace XenAPI } private string _repository_proxy_username = ""; + /// + /// Password for the authentication of the proxy used in syncing with the enabled repositories + /// First published in 21.3.0. + /// + [JsonConverter(typeof(XenRefConverter))] + public virtual XenRef repository_proxy_password + { + get { return _repository_proxy_password; } + set + { + if (!Helper.AreEqual(value, _repository_proxy_password)) + { + _repository_proxy_password = value; + NotifyPropertyChanged("repository_proxy_password"); + } + } + } + private XenRef _repository_proxy_password = new XenRef("OpaqueRef:NULL"); + /// /// Default behaviour during migration, True if stream compression should be used /// Experimental. First published in 22.33.0. @@ -3558,5 +3691,62 @@ namespace XenAPI } } private bool _coordinator_bias = true; + + /// + /// The UUID of the pool for identification of telemetry data + /// Experimental. First published in 23.9.0. + /// + [JsonConverter(typeof(XenRefConverter))] + public virtual XenRef telemetry_uuid + { + get { return _telemetry_uuid; } + set + { + if (!Helper.AreEqual(value, _telemetry_uuid)) + { + _telemetry_uuid = value; + NotifyPropertyChanged("telemetry_uuid"); + } + } + } + private XenRef _telemetry_uuid = new XenRef("OpaqueRef:NULL"); + + /// + /// How often the telemetry collection will be carried out + /// Experimental. First published in 23.9.0. + /// + [JsonConverter(typeof(telemetry_frequencyConverter))] + public virtual telemetry_frequency telemetry_frequency + { + get { return _telemetry_frequency; } + set + { + if (!Helper.AreEqual(value, _telemetry_frequency)) + { + _telemetry_frequency = value; + NotifyPropertyChanged("telemetry_frequency"); + } + } + } + private telemetry_frequency _telemetry_frequency = telemetry_frequency.weekly; + + /// + /// The earliest timestamp (in UTC) when the next round of telemetry collection can be carried out + /// Experimental. First published in 23.9.0. + /// + [JsonConverter(typeof(XenDateTimeConverter))] + public virtual DateTime telemetry_next_collection + { + get { return _telemetry_next_collection; } + set + { + if (!Helper.AreEqual(value, _telemetry_next_collection)) + { + _telemetry_next_collection = value; + NotifyPropertyChanged("telemetry_next_collection"); + } + } + } + private DateTime _telemetry_next_collection = DateTime.ParseExact("19700101T00:00:00Z", "yyyyMMddTHH:mm:ssZ", CultureInfo.InvariantCulture); } } diff --git a/XenModel/XenAPI/VTPM.cs b/XenModel/XenAPI/VTPM.cs index b1b871e58..69e5481b1 100644 --- a/XenModel/XenAPI/VTPM.cs +++ b/XenModel/XenAPI/VTPM.cs @@ -52,6 +52,8 @@ namespace XenAPI } public VTPM(string uuid, + List allowed_operations, + Dictionary current_operations, XenRef VM, XenRef backend, persistence_backend persistence_backend, @@ -59,6 +61,8 @@ namespace XenAPI bool is_protected) { this.uuid = uuid; + this.allowed_operations = allowed_operations; + this.current_operations = current_operations; this.VM = VM; this.backend = backend; this.persistence_backend = persistence_backend; @@ -87,6 +91,8 @@ namespace XenAPI public override void UpdateFrom(VTPM record) { uuid = record.uuid; + allowed_operations = record.allowed_operations; + current_operations = record.current_operations; VM = record.VM; backend = record.backend; persistence_backend = record.persistence_backend; @@ -104,6 +110,10 @@ namespace XenAPI { if (table.ContainsKey("uuid")) uuid = Marshalling.ParseString(table, "uuid"); + if (table.ContainsKey("allowed_operations")) + allowed_operations = Helper.StringArrayToEnumList(Marshalling.ParseStringArray(table, "allowed_operations")); + if (table.ContainsKey("current_operations")) + current_operations = Maps.convert_from_proxy_string_vtpm_operations(Marshalling.ParseHashTable(table, "current_operations")); if (table.ContainsKey("VM")) VM = Marshalling.ParseRef(table, "VM"); if (table.ContainsKey("backend")) @@ -116,14 +126,18 @@ namespace XenAPI is_protected = Marshalling.ParseBool(table, "is_protected"); } - public bool DeepEquals(VTPM other) + public bool DeepEquals(VTPM other, bool ignoreCurrentOperations) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; + if (!ignoreCurrentOperations && !Helper.AreEqual2(this.current_operations, other.current_operations)) + return false; + return Helper.AreEqual2(this._uuid, other._uuid) && + Helper.AreEqual2(this._allowed_operations, other._allowed_operations) && Helper.AreEqual2(this._VM, other._VM) && Helper.AreEqual2(this._backend, other._backend) && Helper.AreEqual2(this._persistence_backend, other._persistence_backend) && @@ -177,6 +191,28 @@ namespace XenAPI return session.JsonRpcClient.vtpm_get_uuid(session.opaque_ref, _vtpm); } + /// + /// Get the allowed_operations field of the given VTPM. + /// First published in XenServer 4.0. + /// + /// The session + /// The opaque_ref of the given vtpm + public static List get_allowed_operations(Session session, string _vtpm) + { + return session.JsonRpcClient.vtpm_get_allowed_operations(session.opaque_ref, _vtpm); + } + + /// + /// Get the current_operations field of the given VTPM. + /// First published in XenServer 4.0. + /// + /// The session + /// The opaque_ref of the given vtpm + public static Dictionary get_current_operations(Session session, string _vtpm) + { + return session.JsonRpcClient.vtpm_get_current_operations(session.opaque_ref, _vtpm); + } + /// /// Get the VM field of the given VTPM. /// First published in XenServer 4.0. @@ -316,6 +352,42 @@ namespace XenAPI } private string _uuid = ""; + /// + /// list of the operations allowed in this state. This list is advisory only and the server state may have changed by the time this field is read by a client. + /// First published in XenServer 4.0. + /// + public virtual List allowed_operations + { + get { return _allowed_operations; } + set + { + if (!Helper.AreEqual(value, _allowed_operations)) + { + _allowed_operations = value; + NotifyPropertyChanged("allowed_operations"); + } + } + } + private List _allowed_operations = new List() {}; + + /// + /// links each of the running tasks using this object (by reference) to a current_operation enum which describes the nature of the task. + /// First published in XenServer 4.0. + /// + public virtual Dictionary current_operations + { + get { return _current_operations; } + set + { + if (!Helper.AreEqual(value, _current_operations)) + { + _current_operations = value; + NotifyPropertyChanged("current_operations"); + } + } + } + private Dictionary _current_operations = new Dictionary() {}; + /// /// The virtual machine the TPM is attached to /// First published in XenServer 4.0. diff --git a/XenModel/XenAPI/domain_type.cs b/XenModel/XenAPI/domain_type.cs index 529e106f5..129c207e1 100644 --- a/XenModel/XenAPI/domain_type.cs +++ b/XenModel/XenAPI/domain_type.cs @@ -48,6 +48,10 @@ namespace XenAPI /// pv_in_pvh, /// + /// PVH + /// + pvh, + /// /// Not specified or unknown domain type /// unspecified, @@ -74,6 +78,8 @@ namespace XenAPI return "pv"; case domain_type.pv_in_pvh: return "pv_in_pvh"; + case domain_type.pvh: + return "pvh"; case domain_type.unspecified: return "unspecified"; default: diff --git a/XenModel/XenAPI/telemetry_frequency.cs b/XenModel/XenAPI/telemetry_frequency.cs new file mode 100644 index 000000000..b1d61eb26 --- /dev/null +++ b/XenModel/XenAPI/telemetry_frequency.cs @@ -0,0 +1,86 @@ +/* + * Copyright (c) Cloud Software Group, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1) Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2) Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using Newtonsoft.Json; + + +namespace XenAPI +{ + [JsonConverter(typeof(telemetry_frequencyConverter))] + public enum telemetry_frequency + { + /// + /// Run telemetry task daily + /// + daily, + /// + /// Run telemetry task weekly + /// + weekly, + /// + /// Run telemetry task monthly + /// + monthly, + unknown + } + + public static class telemetry_frequency_helper + { + public static string ToString(telemetry_frequency x) + { + return x.StringOf(); + } + } + + public static partial class EnumExt + { + public static string StringOf(this telemetry_frequency x) + { + switch (x) + { + case telemetry_frequency.daily: + return "daily"; + case telemetry_frequency.weekly: + return "weekly"; + case telemetry_frequency.monthly: + return "monthly"; + default: + return "unknown"; + } + } + } + + internal class telemetry_frequencyConverter : XenEnumConverter + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteValue(((telemetry_frequency)value).StringOf()); + } + } +} \ No newline at end of file diff --git a/XenModel/XenAPI/vm_operations.cs b/XenModel/XenAPI/vm_operations.cs index 772e71876..1f7d5df20 100644 --- a/XenModel/XenAPI/vm_operations.cs +++ b/XenModel/XenAPI/vm_operations.cs @@ -227,6 +227,10 @@ namespace XenAPI /// refers to the act of uninstalling the VM /// destroy, + /// + /// Creating and adding a VTPM to this VM + /// + create_vtpm, unknown } @@ -340,6 +344,8 @@ namespace XenAPI return "reverting"; case vm_operations.destroy: return "destroy"; + case vm_operations.create_vtpm: + return "create_vtpm"; default: return "unknown"; } diff --git a/XenModel/XenAPI/vtpm_operations.cs b/XenModel/XenAPI/vtpm_operations.cs new file mode 100644 index 000000000..710cf6992 --- /dev/null +++ b/XenModel/XenAPI/vtpm_operations.cs @@ -0,0 +1,74 @@ +/* + * Copyright (c) Cloud Software Group, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1) Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2) Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using Newtonsoft.Json; + + +namespace XenAPI +{ + [JsonConverter(typeof(vtpm_operationsConverter))] + public enum vtpm_operations + { + /// + /// Destroy a VTPM + /// + destroy, + unknown + } + + public static class vtpm_operations_helper + { + public static string ToString(vtpm_operations x) + { + return x.StringOf(); + } + } + + public static partial class EnumExt + { + public static string StringOf(this vtpm_operations x) + { + switch (x) + { + case vtpm_operations.destroy: + return "destroy"; + default: + return "unknown"; + } + } + } + + internal class vtpm_operationsConverter : XenEnumConverter + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteValue(((vtpm_operations)value).StringOf()); + } + } +} \ No newline at end of file diff --git a/XenModel/XenModel.csproj b/XenModel/XenModel.csproj index 9524a48de..3a6a9a7e8 100755 --- a/XenModel/XenModel.csproj +++ b/XenModel/XenModel.csproj @@ -391,6 +391,7 @@ + @@ -408,6 +409,7 @@ + From 6a06d5b8d94265b68004b46115fc25c8a0e7a955 Mon Sep 17 00:00:00 2001 From: Konstantina Chremmou Date: Tue, 11 Apr 2023 15:41:31 +0100 Subject: [PATCH 2/4] CP-42691: Use allowed operations to enable/disable vTPM create/destroy. Signed-off-by: Konstantina Chremmou --- XenAdmin/Dialogs/VtmpManagementDialog.cs | 26 +++++++++++++++++++----- XenAdmin/Dialogs/VtpmManagementPage.cs | 26 ++++++++++++++++++++---- XenModel/Actions/VM/CreateVMAction.cs | 9 ++++++-- XenModel/Messages.Designer.cs | 18 ++++++++++++++++ XenModel/Messages.resx | 6 ++++++ XenModel/Utils/Helpers.Versions.cs | 6 ++++++ XenModel/XenAPI-Extensions/VM.cs | 13 ++++++++++-- 7 files changed, 91 insertions(+), 13 deletions(-) diff --git a/XenAdmin/Dialogs/VtmpManagementDialog.cs b/XenAdmin/Dialogs/VtmpManagementDialog.cs index 34fc60314..81ce43d23 100644 --- a/XenAdmin/Dialogs/VtmpManagementDialog.cs +++ b/XenAdmin/Dialogs/VtmpManagementDialog.cs @@ -175,6 +175,22 @@ namespace XenAdmin.Dialogs dlg.ShowDialog(this); } + private bool CanRemoveVtpm(VTPM vtpm, out string cannotReason) + { + cannotReason = null; + + if (Helpers.XapiEqualOrGreater_23_10_0(vtpm.Connection)) + { + if (vtpm.allowed_operations.Contains(vtpm_operations.destroy)) + return true; + + cannotReason = Messages.VTPM_OPERATION_DISALLOWED_REMOVE; + return false; + } + + return _vm.CanRemoveVtpm(out cannotReason); + } + private void ResizeVerticalTabs() { int maxHeight = splitContainer.Panel1.Height - toolTipContainerAdd.Height; @@ -182,12 +198,12 @@ namespace XenAdmin.Dialogs toolTipContainerAdd.Top = verticalTabs.Top + verticalTabs.Height; } - private void ShowTooltip(Point location) + private void ShowTooltip(VtpmManagementPage page, Point location) { if (!_toolTipVisible) { Cursor = Cursors.Hand; - var msg = _vm.CanRemoveVtpm(out var cannotReason) ? Messages.VTPM_REMOVE : cannotReason; + var msg = CanRemoveVtpm(page.Vtpm, out var cannotReason) ? Messages.VTPM_REMOVE : cannotReason; if (!string.IsNullOrEmpty(cannotReason)) { @@ -231,7 +247,7 @@ namespace XenAdmin.Dialogs if (!(verticalTabs.Items[pageIndex] is VtpmManagementPage page)) return; - var deleteIcon = _vm.CanRemoveVtpm(out _) ? Images.StaticImages._000_Abort_h32bit_16 : Images.StaticImages._000_Abort_gray_h32bit_16; + var deleteIcon = CanRemoveVtpm(page.Vtpm, out _) ? Images.StaticImages._000_Abort_h32bit_16 : Images.StaticImages._000_Abort_gray_h32bit_16; page.DeleteIconBounds = new Rectangle(e.Bounds.Right - deleteIcon.Width - (32 - deleteIcon.Width) / 2, e.Bounds.Y + (32 - deleteIcon.Height) / 2, deleteIcon.Width, deleteIcon.Height); @@ -249,7 +265,7 @@ namespace XenAdmin.Dialogs return; if (page.DeleteIconBounds.Contains(e.Location)) - ShowTooltip(e.Location); + ShowTooltip(page, e.Location); else HideTooltip(); } @@ -263,7 +279,7 @@ namespace XenAdmin.Dialogs if (!(verticalTabs.Items[pageIndex] is VtpmManagementPage page)) return; - if (page.DeleteIconBounds.Contains(e.Location) && _vm.CanRemoveVtpm(out _)) + if (page.DeleteIconBounds.Contains(e.Location) && CanRemoveVtpm(page.Vtpm, out _)) RemoveVtpm(page.Vtpm); } diff --git a/XenAdmin/Dialogs/VtpmManagementPage.cs b/XenAdmin/Dialogs/VtpmManagementPage.cs index 3b2e3b6f3..7c9c47ecf 100644 --- a/XenAdmin/Dialogs/VtpmManagementPage.cs +++ b/XenAdmin/Dialogs/VtpmManagementPage.cs @@ -81,9 +81,7 @@ namespace XenAdmin.Dialogs private void UpdateButtons() { - var vm = Vtpm.Connection.Resolve(Vtpm.VM); - string cannotReason = null; - buttonRemove.Enabled = vm!= null && vm.CanRemoveVtpm(out cannotReason); + buttonRemove.Enabled = CanRemoveVtpm(out string cannotReason); if (buttonRemove.Enabled) toolTipContainerRemove.RemoveAll(); @@ -91,13 +89,33 @@ namespace XenAdmin.Dialogs toolTipContainerRemove.SetToolTip(cannotReason); } + private bool CanRemoveVtpm(out string cannotReason) + { + cannotReason = null; + + if (Helpers.XapiEqualOrGreater_23_10_0(Vtpm.Connection)) + { + if (Vtpm.allowed_operations.Contains(vtpm_operations.destroy)) + return true; + + cannotReason = Messages.VTPM_OPERATION_DISALLOWED_REMOVE; + return false; + } + + var vm = Vtpm.Connection.Resolve(Vtpm.VM); + return vm != null && vm.CanRemoveVtpm(out cannotReason); + } + private void Vtpm_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (!(sender is VTPM)) + if (!(sender is VTPM vtpm)) return; if (e.PropertyName == "is_protected" || e.PropertyName == "is_unique") Program.Invoke(this, UpdateProperties); + + if (e.PropertyName == "allowed_operations" && Helpers.XapiEqualOrGreater_23_10_0(vtpm.Connection)) + Program.Invoke(this, UpdateButtons); } private void buttonRemove_Click(object sender, EventArgs e) diff --git a/XenModel/Actions/VM/CreateVMAction.cs b/XenModel/Actions/VM/CreateVMAction.cs index f7740081b..a791ba9ea 100644 --- a/XenModel/Actions/VM/CreateVMAction.cs +++ b/XenModel/Actions/VM/CreateVMAction.cs @@ -275,8 +275,13 @@ namespace XenAdmin.Actions.VMActions private void AssignVtpm() { - if (_assignVtpm) - new NewVtpmAction(Connection, VM).RunSync(Session); + if (!_assignVtpm) + return; + + if (Helpers.XapiEqualOrGreater_23_10_0(Connection) && !VM.allowed_operations.Contains(vm_operations.create_vtpm)) + return; + + new NewVtpmAction(Connection, VM).RunSync(Session); } private void AssignVgpu() diff --git a/XenModel/Messages.Designer.cs b/XenModel/Messages.Designer.cs index ef7a07629..488c59707 100755 --- a/XenModel/Messages.Designer.cs +++ b/XenModel/Messages.Designer.cs @@ -40165,6 +40165,24 @@ namespace XenAdmin { } } + /// + /// Looks up a localized string similar to Attaching a new vTPM to this VM is currently not allowed.. + /// + public static string VTPM_OPERATION_DISALLOWED_ADD { + get { + return ResourceManager.GetString("VTPM_OPERATION_DISALLOWED_ADD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removing this vTPM from the VM is currently not allowed.. + /// + public static string VTPM_OPERATION_DISALLOWED_REMOVE { + get { + return ResourceManager.GetString("VTPM_OPERATION_DISALLOWED_REMOVE", resourceCulture); + } + } + /// /// Looks up a localized string similar to You need to shut down this VM before you can attach a new vTPM to it.. /// diff --git a/XenModel/Messages.resx b/XenModel/Messages.resx index db76ca439..8817736eb 100755 --- a/XenModel/Messages.resx +++ b/XenModel/Messages.resx @@ -13873,6 +13873,12 @@ Schedule: There are no vTPMs attached to this VM. + + Attaching a new vTPM to this VM is currently not allowed. + + + Removing this vTPM from the VM is currently not allowed. + You need to shut down this VM before you can attach a new vTPM to it. diff --git a/XenModel/Utils/Helpers.Versions.cs b/XenModel/Utils/Helpers.Versions.cs index caf2d7c27..af3f59aed 100644 --- a/XenModel/Utils/Helpers.Versions.cs +++ b/XenModel/Utils/Helpers.Versions.cs @@ -450,6 +450,12 @@ namespace XenAdmin.Core return coordinator == null || ProductVersionCompare(coordinator.GetXapiVersion(), "22.33.0") >= 0; } + public static bool XapiEqualOrGreater_23_10_0(IXenConnection conn) + { + var coordinator = GetCoordinator(conn); + return coordinator == null || ProductVersionCompare(coordinator.GetXapiVersion(), "23.10.0") >= 0; + } + #endregion } } diff --git a/XenModel/XenAPI-Extensions/VM.cs b/XenModel/XenAPI-Extensions/VM.cs index f2f3e7efb..7b1d3c446 100644 --- a/XenModel/XenAPI-Extensions/VM.cs +++ b/XenModel/XenAPI-Extensions/VM.cs @@ -1797,9 +1797,18 @@ namespace XenAPI { cannotReason = null; - if (VTPMs.Count >= VM.MAX_ALLOWED_VTPMS) + if (Helpers.XapiEqualOrGreater_23_10_0(Connection)) { - cannotReason = string.Format(Messages.VTPM_MAX_REACHED, VM.MAX_ALLOWED_VTPMS); + if (allowed_operations.Contains(vm_operations.create_vtpm)) + return true; + + cannotReason = Messages.VTPM_OPERATION_DISALLOWED_ADD; + return false; + } + + if (VTPMs.Count >= MAX_ALLOWED_VTPMS) + { + cannotReason = string.Format(Messages.VTPM_MAX_REACHED, MAX_ALLOWED_VTPMS); return false; } From 947f9380169a6faf12fd53d0e982cb8c628862a1 Mon Sep 17 00:00:00 2001 From: Konstantina Chremmou Date: Tue, 11 Apr 2023 20:44:32 +0100 Subject: [PATCH 3/4] Corrected typo in filename. Signed-off-by: Konstantina Chremmou --- ...ner.cs => VtpmManagementDialog.Designer.cs} | 0 ...gementDialog.cs => VtpmManagementDialog.cs} | 0 ...og.ja.resx => VtpmManagementDialog.ja.resx} | 0 ...ntDialog.resx => VtpmManagementDialog.resx} | 0 ...CN.resx => VtpmManagementDialog.zh-CN.resx} | 0 XenAdmin/XenAdmin.csproj | 18 +++++++++--------- 6 files changed, 9 insertions(+), 9 deletions(-) rename XenAdmin/Dialogs/{VtmpManagementDialog.Designer.cs => VtpmManagementDialog.Designer.cs} (100%) rename XenAdmin/Dialogs/{VtmpManagementDialog.cs => VtpmManagementDialog.cs} (100%) rename XenAdmin/Dialogs/{VtmpManagementDialog.ja.resx => VtpmManagementDialog.ja.resx} (100%) rename XenAdmin/Dialogs/{VtmpManagementDialog.resx => VtpmManagementDialog.resx} (100%) rename XenAdmin/Dialogs/{VtmpManagementDialog.zh-CN.resx => VtpmManagementDialog.zh-CN.resx} (100%) diff --git a/XenAdmin/Dialogs/VtmpManagementDialog.Designer.cs b/XenAdmin/Dialogs/VtpmManagementDialog.Designer.cs similarity index 100% rename from XenAdmin/Dialogs/VtmpManagementDialog.Designer.cs rename to XenAdmin/Dialogs/VtpmManagementDialog.Designer.cs diff --git a/XenAdmin/Dialogs/VtmpManagementDialog.cs b/XenAdmin/Dialogs/VtpmManagementDialog.cs similarity index 100% rename from XenAdmin/Dialogs/VtmpManagementDialog.cs rename to XenAdmin/Dialogs/VtpmManagementDialog.cs diff --git a/XenAdmin/Dialogs/VtmpManagementDialog.ja.resx b/XenAdmin/Dialogs/VtpmManagementDialog.ja.resx similarity index 100% rename from XenAdmin/Dialogs/VtmpManagementDialog.ja.resx rename to XenAdmin/Dialogs/VtpmManagementDialog.ja.resx diff --git a/XenAdmin/Dialogs/VtmpManagementDialog.resx b/XenAdmin/Dialogs/VtpmManagementDialog.resx similarity index 100% rename from XenAdmin/Dialogs/VtmpManagementDialog.resx rename to XenAdmin/Dialogs/VtpmManagementDialog.resx diff --git a/XenAdmin/Dialogs/VtmpManagementDialog.zh-CN.resx b/XenAdmin/Dialogs/VtpmManagementDialog.zh-CN.resx similarity index 100% rename from XenAdmin/Dialogs/VtmpManagementDialog.zh-CN.resx rename to XenAdmin/Dialogs/VtpmManagementDialog.zh-CN.resx diff --git a/XenAdmin/XenAdmin.csproj b/XenAdmin/XenAdmin.csproj index 088c8c062..3cfc6776c 100755 --- a/XenAdmin/XenAdmin.csproj +++ b/XenAdmin/XenAdmin.csproj @@ -313,11 +313,11 @@ VtpmManagementPage.cs - + Form - - VtmpManagementDialog.cs + + VtpmManagementDialog.cs UserControl @@ -1804,16 +1804,16 @@ VtpmManagementPage.cs - - VtmpManagementDialog.cs + + VtpmManagementDialog.cs Designer - - VtmpManagementDialog.cs + + VtpmManagementDialog.cs Designer - - VtmpManagementDialog.cs + + VtpmManagementDialog.cs Designer From 240fa7833363ec83d228c056046518c8b3a7d53a Mon Sep 17 00:00:00 2001 From: Konstantina Chremmou Date: Mon, 24 Apr 2023 21:53:24 +0100 Subject: [PATCH 4/4] CP-39687: Exporting VMs with vTPMs to XVA package is now supported. Signed-off-by: Konstantina Chremmou --- .../ExportSelectVMsPage.Designer.cs | 12 ++--- .../ExportWizard/ExportSelectVMsPage.cs | 21 ++++++-- .../ExportWizard/ExportSelectVMsPage.resx | 48 +++++++++---------- XenModel/Messages.Designer.cs | 18 +++++++ XenModel/Messages.resx | 6 +++ XenModel/Utils/Helpers.Versions.cs | 6 +++ 6 files changed, 78 insertions(+), 33 deletions(-) diff --git a/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.Designer.cs b/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.Designer.cs index 541c4a5d2..b3a013db4 100644 --- a/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.Designer.cs +++ b/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.Designer.cs @@ -50,7 +50,7 @@ this.label2 = new System.Windows.Forms.Label(); this._tlpWarning = new System.Windows.Forms.TableLayoutPanel(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); - this.label1 = new System.Windows.Forms.Label(); + this.labelWarning = new System.Windows.Forms.Label(); this.tableLayoutPanel2.SuspendLayout(); this.m_tlpInfo.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); @@ -208,7 +208,7 @@ // resources.ApplyResources(this._tlpWarning, "_tlpWarning"); this._tlpWarning.Controls.Add(this.pictureBox2, 0, 0); - this._tlpWarning.Controls.Add(this.label1, 1, 0); + this._tlpWarning.Controls.Add(this.labelWarning, 1, 0); this._tlpWarning.Name = "_tlpWarning"; // // pictureBox2 @@ -218,10 +218,10 @@ this.pictureBox2.Name = "pictureBox2"; this.pictureBox2.TabStop = false; // - // label1 + // labelWarning // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; + resources.ApplyResources(this.labelWarning, "labelWarning"); + this.labelWarning.Name = "labelWarning"; // // ExportSelectVMsPage // @@ -270,6 +270,6 @@ private System.Windows.Forms.DataGridViewTextBoxColumn columnVapp; private System.Windows.Forms.TableLayoutPanel _tlpWarning; private System.Windows.Forms.PictureBox pictureBox2; - private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label labelWarning; } } diff --git a/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.cs b/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.cs index 5dd65b262..b2a02fa05 100644 --- a/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.cs +++ b/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.cs @@ -304,9 +304,24 @@ namespace XenAdmin.Wizards.ExportWizard { var count = VMsToExport.Count; m_tlpInfo.Visible = ExportAsXva && count > 1; - _tlpWarning.Visible = !Helpers.FeatureForbidden(Connection, Host.RestrictVtpm) && - Helpers.XapiEqualOrGreater_22_26_0(Connection) && - VMsToExport.Any(v => v.VTPMs.Count > 0); + + if (Helpers.FeatureForbidden(Connection, Host.RestrictVtpm) || + !Helpers.XapiEqualOrGreater_22_26_0(Connection) || + !VMsToExport.Any(v => v.VTPMs.Count > 0)) + { + _tlpWarning.Visible = false; + } + else if (Helpers.XapiEqualOrGreater_23_9_0(Connection)) + { + labelWarning.Text = Messages.VTPM_EXPORT_UNSUPPORTED_FOR_OVF; + _tlpWarning.Visible = !ExportAsXva; + } + else + { + labelWarning.Text = Messages.VTPM_EXPORT_UNSUPPORTED_FOR_ALL; + _tlpWarning.Visible = true; + } + m_buttonNextEnabled = ExportAsXva ? count == 1 : count > 0; m_buttonClearAll.Enabled = count > 0; m_buttonSelectAll.Enabled = count < m_dataGridView.RowCount; diff --git a/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.resx b/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.resx index fb508fcb0..0ffd81dd3 100644 --- a/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.resx +++ b/XenAdmin/Wizards/ExportWizard/ExportSelectVMsPage.resx @@ -148,7 +148,7 @@ m_ctrlError - XenAdmin.Controls.Common.PasswordFailure, [XenCenter_No_Space]Main, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + XenAdmin.Controls.Common.PasswordFailure, [XenCenter_No_Space], Version=0.0.0.0, Culture=neutral, PublicKeyToken=null tableLayoutPanel2 @@ -185,7 +185,7 @@ Note that only VMs that are currently shut down or suspended are listed here.m_labelIntro - XenAdmin.Controls.Common.AutoHeightLabel, [XenCenter_No_Space]Main, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + XenAdmin.Controls.Common.AutoHeightLabel, [XenCenter_No_Space], Version=0.0.0.0, Culture=neutral, PublicKeyToken=null tableLayoutPanel2 @@ -311,7 +311,7 @@ Note that only VMs that are currently shut down or suspended are listed here.autoHeightLabel1 - XenAdmin.Controls.Common.AutoHeightLabel, [XenCenter_No_Space]Main, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + XenAdmin.Controls.Common.AutoHeightLabel, [XenCenter_No_Space], Version=0.0.0.0, Culture=neutral, PublicKeyToken=null m_tlpInfo @@ -323,7 +323,7 @@ Note that only VMs that are currently shut down or suspended are listed here.Fill - 3, 295 + 3, 299 1 @@ -392,7 +392,7 @@ Note that only VMs that are currently shut down or suspended are listed here.6, 3, 6, 3 - 567, 180 + 567, 184 102 @@ -452,7 +452,7 @@ Note that only VMs that are currently shut down or suspended are listed here.Fill - 3, 260 + 3, 264 1 @@ -500,7 +500,7 @@ Note that only VMs that are currently shut down or suspended are listed here.m_searchTextBox - XenAdmin.Controls.SearchTextBox, [XenCenter_No_Space]Main, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + XenAdmin.Controls.SearchTextBox, [XenCenter_No_Space], Version=0.0.0.0, Culture=neutral, PublicKeyToken=null tableLayoutPanel4 @@ -598,47 +598,47 @@ Note that only VMs that are currently shut down or suspended are listed here. 0 - + True - + Fill - + 25, 0 - - 545, 26 + + 545, 22 - + 1 - - Exporting VMs with attached vTPMs is not supported. If you export and re-import these VMs, some of their security features may be deactivated and the VMs may not start. + + labelWarning - - label1 + + labelWarning - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + _tlpWarning - + 1 Fill - 3, 327 + 3, 331 1 - 573, 26 + 573, 22 105 @@ -656,7 +656,7 @@ Note that only VMs that are currently shut down or suspended are listed here.6 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="pictureBox2" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label1" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="pictureBox2" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="labelWarning" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0" /></TableLayoutSettings> Fill @@ -731,6 +731,6 @@ Note that only VMs that are currently shut down or suspended are listed here.ExportSelectVMsPage - XenAdmin.Controls.XenTabPage, [XenCenter_No_Space]Main, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + XenAdmin.Controls.XenTabPage, [XenCenter_No_Space], Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/XenModel/Messages.Designer.cs b/XenModel/Messages.Designer.cs index 488c59707..b40798fd9 100755 --- a/XenModel/Messages.Designer.cs +++ b/XenModel/Messages.Designer.cs @@ -40129,6 +40129,24 @@ namespace XenAdmin { } } + /// + /// Looks up a localized string similar to Your selection includes VMs with attached vTPMs. If you export and re-import these VMs, the vTPM data will not be preserved. Some of the VMs' security features may be deactivated and the VMs may not start.. + /// + public static string VTPM_EXPORT_UNSUPPORTED_FOR_ALL { + get { + return ResourceManager.GetString("VTPM_EXPORT_UNSUPPORTED_FOR_ALL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VMs with attached vTPMs can only be exported in XVA format. If you export and re-import these VMs, the vTPM data will not be preserved. Some of the VMs' security features may be deactivated and the VMs may not start.. + /// + public static string VTPM_EXPORT_UNSUPPORTED_FOR_OVF { + get { + return ResourceManager.GetString("VTPM_EXPORT_UNSUPPORTED_FOR_OVF", resourceCulture); + } + } + /// /// Looks up a localized string similar to The maximum number of vTPMs that can be attached to this VM is {0}.. /// diff --git a/XenModel/Messages.resx b/XenModel/Messages.resx index 8817736eb..a6b9d6596 100755 --- a/XenModel/Messages.resx +++ b/XenModel/Messages.resx @@ -13861,6 +13861,12 @@ Schedule: A vTPM is attached to this VM. + + Your selection includes VMs with attached vTPMs. If you export and re-import these VMs, the vTPM data will not be preserved. Some of the VMs' security features may be deactivated and the VMs may not start. + + + VMs with attached vTPMs can only be exported in XVA format. If you export and re-import these VMs, the vTPM data will not be preserved. Some of the VMs' security features may be deactivated and the VMs may not start. + The maximum number of vTPMs that can be attached to this VM is {0}. diff --git a/XenModel/Utils/Helpers.Versions.cs b/XenModel/Utils/Helpers.Versions.cs index af3f59aed..2ce4c59d9 100644 --- a/XenModel/Utils/Helpers.Versions.cs +++ b/XenModel/Utils/Helpers.Versions.cs @@ -450,6 +450,12 @@ namespace XenAdmin.Core return coordinator == null || ProductVersionCompare(coordinator.GetXapiVersion(), "22.33.0") >= 0; } + public static bool XapiEqualOrGreater_23_9_0(IXenConnection conn) + { + var coordinator = GetCoordinator(conn); + return coordinator == null || ProductVersionCompare(coordinator.GetXapiVersion(), "23.9.0") >= 0; + } + public static bool XapiEqualOrGreater_23_10_0(IXenConnection conn) { var coordinator = GetCoordinator(conn);