public async Task WhenGuestAttributesDisabledByPolicy_ThenOsPropertiesAreNull(
            [WindowsInstance] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.ComputeViewer)] ResourceTask <ICredential> credential)
        {
            var locator = await testInstance;

            var gceAdapter       = new ComputeEngineAdapter(await credential);
            var inventoryService = new Mock <IInventoryService>();

            inventoryService.Setup(s => s.GetInstanceInventoryAsync(
                                       It.IsAny <InstanceLocator>(),
                                       It.IsAny <CancellationToken>()))
            .Throws(new GoogleApiException("mock", "mock")
            {
                Error = new Apis.Requests.RequestError()
                {
                    Code = 412
                }
            });

            var model = await InstancePropertiesInspectorModel.LoadAsync(
                await testInstance,
                gceAdapter,
                inventoryService.Object,
                CancellationToken.None);

            Assert.AreEqual(locator.Name, model.InstanceName);
            Assert.AreEqual("RUNNING", model.Status);

            Assert.IsFalse(model.IsOsInventoryInformationPopulated);
            Assert.IsNull(model.Architecture);
            Assert.IsNull(model.KernelVersion);
            Assert.IsNull(model.OperatingSystemFullName);
            Assert.IsNull(model.OperatingSystemVersion);
        }
        public async Task WhenLoadAsyncCompletes_ThenPropertiesArePopulated(
            [WindowsInstance] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.ComputeViewer)] ResourceTask <ICredential> credential)
        {
            var locator = await testInstance;

            var gceAdapter = new ComputeEngineAdapter(await credential);
            var model      = await InstancePropertiesInspectorModel.LoadAsync(
                await testInstance,
                gceAdapter,
                new InventoryService(gceAdapter),
                CancellationToken.None);

            Assert.AreEqual(locator.Name, model.InstanceName);
            Assert.IsNull(model.Hostname);
            Assert.AreEqual("RUNNING", model.Status);
            Assert.IsNotNull(model.InternalIp);
            Assert.IsNotNull(model.ExternalIp);
            Assert.IsNotNull(model.Licenses);
            Assert.AreEqual(model.IsOsInventoryInformationPopulated
                ? FeatureFlag.Enabled : FeatureFlag.Disabled, model.OsInventory);
            Assert.AreEqual(FeatureFlag.Disabled, model.Diagnostics);
            Assert.AreEqual(FeatureFlag.Enabled, model.GuestAttributes);
            Assert.IsNull(model.InternalDnsMode);
            Assert.IsFalse(model.IsSoleTenant);
            Assert.AreEqual(WindowsInstanceAttribute.DefaultMachineType, model.MachineType);
            Assert.IsNull(model.Tags);
        }
        public void WhenFlagSetInCommonInstanceMetadataOnly_ThenInstanceCommonInstanceMetadataPrevails()
        {
            var project = new Project()
            {
                CommonInstanceMetadata = new Metadata()
                {
                    Items = new[]
                    {
                        new Metadata.ItemsData()
                        {
                            Key   = "VmDnsSetting",
                            Value = "ZonalOnly"
                        }
                    }
                }
            };

            var instance = new Instance
            {
                Metadata = new Metadata()
            };

            var model = new InstancePropertiesInspectorModel(project, instance, null);

            Assert.AreEqual("ZonalOnly", model.InternalDnsMode);
        }
        public void WhenFlagSetInInstanceMetadataOnly_ThenInstanceMetadataPrevails()
        {
            var project  = new Project();
            var instance = new Instance
            {
                Metadata = new Metadata()
                {
                    Items = new[]
                    {
                        new Metadata.ItemsData()
                        {
                            Key   = "VmDnsSetting",
                            Value = "ZonalPreferred"
                        },
                        new Metadata.ItemsData()
                        {
                            Key   = "enable-oslogin-2fa",
                            Value = "true"
                        }
                    }
                }
            };

            var model = new InstancePropertiesInspectorModel(project, instance, null);

            Assert.AreEqual("ZonalPreferred", model.InternalDnsMode);
            Assert.AreEqual(FeatureFlag.Enabled, model.OsLogin2FA);
        }
        public void WhenMetadataIsEmpty_ThenDefaultsAreApplied()
        {
            var project  = new Project();
            var instance = new Instance();

            var model = new InstancePropertiesInspectorModel(project, instance, null);

            Assert.AreEqual(FeatureFlag.Disabled, model.OsInventory);
            Assert.AreEqual(FeatureFlag.Disabled, model.Diagnostics);
            Assert.AreEqual(FeatureFlag.Disabled, model.SerialPortAccess);
            Assert.AreEqual(FeatureFlag.Disabled, model.GuestAttributes);
            Assert.IsNull(model.InternalDnsMode);
        }
        public void WhenFlagSetInCommonInstanceMetadataAndInstanceMetadata_ThenInstanceMetadataPrevails()
        {
            var project = new Project()
            {
                CommonInstanceMetadata = new Metadata()
                {
                    Items = new[]
                    {
                        new Metadata.ItemsData()
                        {
                            Key   = "VmDnsSetting",
                            Value = "ZonalOnly"
                        },
                        new Metadata.ItemsData()
                        {
                            Key   = "enable-oslogin",
                            Value = "true"
                        },
                        new Metadata.ItemsData()
                        {
                            Key   = "enable-oslogin-2fa",
                            Value = "true"
                        },
                        new Metadata.ItemsData()
                        {
                            Key   = "block-project-ssh-keys",
                            Value = "false"
                        }
                    }
                }
            };

            var instance = new Instance
            {
                Metadata = new Metadata()
                {
                    Items = new[]
                    {
                        new Metadata.ItemsData()
                        {
                            Key   = "VmDnsSetting",
                            Value = "ZonalPreferred"
                        },
                        new Metadata.ItemsData()
                        {
                            Key   = "enable-oslogin",
                            Value = "false"
                        },
                        new Metadata.ItemsData()
                        {
                            Key   = "enable-oslogin-2fa",
                            Value = "false"
                        },
                        new Metadata.ItemsData()
                        {
                            Key   = "block-project-ssh-keys",
                            Value = "true"
                        }
                    }
                }
            };

            var model = new InstancePropertiesInspectorModel(project, instance, null);

            Assert.AreEqual("ZonalPreferred", model.InternalDnsMode);
            Assert.AreEqual(FeatureFlag.Disabled, model.OsLogin);
            Assert.AreEqual(FeatureFlag.Disabled, model.OsLogin2FA);
            Assert.AreEqual(FeatureFlag.Enabled, model.BlockProjectSshKeys);
        }