Exemplo n.º 1
0
        public void WaitForChangeTimeout()
        {
            var client            = MetadataClient.Create();
            var initialTags       = client.WaitForChange("instance/tags", timeout: TimeSpan.FromMilliseconds(1));
            var initialAttributes = client.WaitForChange("instance/attributes", timeout: TimeSpan.FromMilliseconds(1));

            // Wait for change on a value key
            var sw     = Stopwatch.StartNew();
            var result = client.WaitForChange("instance/tags", timeout: TimeSpan.FromSeconds(7));

            sw.Stop();
            Assert.Equal(initialTags.Content, result.Content);
            Assert.Equal(initialTags.ETag, result.ETag);
            Assert.NotNull(result.ETag);
            Assert.True(sw.Elapsed.TotalSeconds >= 7);

            // Wait for change on a directory key
            sw     = Stopwatch.StartNew();
            result = client.WaitForChange("instance/attributes", timeout: TimeSpan.FromSeconds(5));
            sw.Stop();
            Assert.Equal(initialAttributes.Content, result.Content);
            Assert.Equal(initialAttributes.ETag, result.ETag);
            Assert.NotNull(result.ETag);
            Assert.True(sw.Elapsed.TotalSeconds >= 5);
        }
Exemplo n.º 2
0
        public void GetMaintenanceStatus()
        {
            var client = MetadataClient.Create();
            var status = client.GetMaintenanceStatus();

            Assert.Equal(MaintenanceStatus.None, status);
        }
Exemplo n.º 3
0
        public async Task ProjectMetadataChanged()
        {
            const string newValue = "foo";
            string       key      = _fixture.GenerateCustomKey();

            var client = MetadataClient.Create();

            var waitHandle = new ManualResetEventSlim(false);
            int eventCount = 0;

            client.ProjectMetadataChanged += (s, e) =>
            {
                Assert.Equal(newValue, e.NewMetadata.CommonInstanceMetadata.Items.FirstOrDefault(i => i.Key == key)?.Value);
                eventCount++;
                waitHandle.Set();
            };

            await Task.Delay(TimeSpan.FromSeconds(1));

            await _fixture.UpdateMetadataAsync($"project/attributes/{key}", newValue);

            waitHandle.Wait(TimeSpan.FromSeconds(10));
            Assert.Equal(1, eventCount);
            Assert.Equal(newValue, await client.GetCustomProjectMetadataAsync(key));
        }
Exemplo n.º 4
0
        public void GetCustomProjectMetadata()
        {
            var client = MetadataClient.Create();
            var value  = client.GetCustomProjectMetadata("my_project_key1");

            Assert.Equal("my_project_value1", value);
        }
Exemplo n.º 5
0
        public async Task MaintenanceStatusChanged()
        {
            var client = MetadataClient.Create();

            var waitHandle = new ManualResetEventSlim(false);
            int eventCount = 0;

            client.MaintenanceStatusChanged += (s, e) =>
            {
                eventCount++;
                waitHandle.Set();
            };

            try
            {
                await _fixture.UpdateMetadataAsync("instance/maintenance-event", "MIGRATE_ON_HOST_MAINTENANCE");

                waitHandle.Wait(TimeSpan.FromSeconds(10));
                Assert.Equal(1, eventCount);
                Assert.Equal(MaintenanceStatus.Migrate, client.GetMaintenanceStatus());
            }
            finally
            {
                await _fixture.UpdateMetadataAsync("instance/maintenance-event", "NONE");
            }
        }
Exemplo n.º 6
0
        public void GetCustomInstanceMetadata()
        {
            var client = MetadataClient.Create();
            var value  = client.GetCustomInstanceMetadata("my_instance_key1");

            Assert.Equal("my_instance_value1", value);
        }
Exemplo n.º 7
0
        private static Instance GetMetadata()
        {
            MetadataClient client   = MetadataClient.Create();
            var            instance = client.GetInstanceMetadata();

            return(instance);
        }
Exemplo n.º 8
0
        public async Task InstanceMetadataChanged_HookTwice()
        {
            const string newValue = "foo";
            string       key      = _fixture.GenerateCustomKey();

            var client = MetadataClient.Create();

            var      waitHandle1 = new ManualResetEventSlim(false);
            var      waitHandle2 = new ManualResetEventSlim(false);
            int      eventCount  = 0;
            Instance instance1   = null;
            Instance instance2   = null;

            client.InstanceMetadataChanged += (s, e) =>
            {
                instance1 = e.NewMetadata;
                Interlocked.Increment(ref eventCount);
                waitHandle1.Set();
            };
            client.InstanceMetadataChanged += (s, e) =>
            {
                instance2 = e.NewMetadata;
                Interlocked.Increment(ref eventCount);
                waitHandle2.Set();
            };

            await _fixture.UpdateMetadataAsync($"instance/attributes/{key}", newValue);

            waitHandle1.Wait(TimeSpan.FromSeconds(10));
            waitHandle2.Wait(TimeSpan.FromSeconds(1));
            Assert.Equal(2, eventCount);
            // Ensure the result string is only parsed once and (indirectly) that we only performed a
            // single handing get on the server.
            Assert.Same(instance1, instance2);
        }
Exemplo n.º 9
0
        public void GetAccessToken()
        {
            var client        = MetadataClient.Create();
            var tokenResponse = client.GetAccessToken();

            Assert.Equal("0123456789ABCDEF", tokenResponse.AccessToken);
            Assert.Equal(3000, tokenResponse.ExpiresInSeconds.Value);
            Assert.Equal("Bearer", tokenResponse.TokenType);
        }
Exemplo n.º 10
0
        public void GetProjectMetadata()
        {
            var client  = MetadataClient.Create();
            var project = client.GetProjectMetadata();

            Assert.True(project.CommonInstanceMetadata.Items.Count >= 1);
            Assert.Equal("my_project_value1", project.CommonInstanceMetadata.Items.FirstOrDefault(i => i.Key == "my_project_key1")?.Value);
            Assert.Equal(12345ul, project.Id.Value);
            Assert.Equal("fake-project", project.Name);
        }
        public void GetCustomInstanceMetadata()
        {
            // Snippet: GetCustomInstanceMetadata
            MetadataClient client      = MetadataClient.Create();
            string         customValue = client.GetCustomInstanceMetadata("my_instance_key1");

            Console.WriteLine(customValue);
            // End snippet

            Assert.Equal("my_instance_value1", customValue);
        }
        public void GetInstanceMetadata()
        {
            // Snippet: GetInstanceMetadata
            MetadataClient client   = MetadataClient.Create();
            Instance       instance = client.GetInstanceMetadata();

            Console.Write(instance.Zone);
            // End snippet

            Assert.Equal(instance.Zone, "projects/12345/zones/us-central1-f");
        }
        public async Task WaitForChange()
        {
            const string newValue = "foo";
            string       key      = _fixture.GenerateCustomKey();

            await _fixture.UpdateMetadataAsync($"instance/attributes/{key}", "initial value");

            var task = Task.Run(async() =>
            {
                await Task.Delay(TimeSpan.FromSeconds(2));
                await _fixture.UpdateMetadataAsync($"instance/attributes/{key}", newValue);
            });

            // Snippet: WaitForChange
            MetadataClient client = MetadataClient.Create();

            // Get the original metadata and its ETag so we know when the metadata changes.
            MetadataResult initialResult = client.GetMetadata("instance/attributes");

            Console.WriteLine("Initial Metadata:");
            JObject initialMetadata = JObject.Parse(initialResult.Content);

            foreach (JProperty property in initialMetadata.Properties())
            {
                Console.WriteLine(property.Name + " = " + property.Value);
            }
            string lastETag = initialResult.ETag;

            MetadataResult changeResult;

            while (true)
            {
                // Wait in 30 second blocks until the value actually changes.
                changeResult = client.WaitForChange("instance/attributes", lastETag, TimeSpan.FromSeconds(30));
                if (changeResult.ETag != lastETag)
                {
                    Console.WriteLine("Changed Metadata:");
                    JObject currentMetadata = JObject.Parse(changeResult.Content);
                    foreach (JProperty property in currentMetadata.Properties())
                    {
                        Console.WriteLine(property.Name + " = " + property.Value);
                    }
                    break;
                }
            }
            // End snippet

            dynamic obj = JsonConvert.DeserializeObject(changeResult.Content);

            Assert.Equal(newValue, obj[key].Value);
            await task;
        }
        public void GetMaintenanceStatus()
        {
            // Snippet: GetMaintenanceStatus
            MetadataClient    client = MetadataClient.Create();
            MaintenanceStatus status = client.GetMaintenanceStatus();

            if (status == MaintenanceStatus.Migrate)
            {
                // Backup data
            }
            // End snippet

            Assert.Equal(MaintenanceStatus.None, status);
        }
        public void GetMetadata()
        {
            // Snippet: GetMetadata
            MetadataClient client = MetadataClient.Create();

            MetadataResult result          = client.GetMetadata("instance/attributes");
            JObject        initialMetadata = JObject.Parse(result.Content);

            foreach (JProperty property in initialMetadata.Properties())
            {
                Console.WriteLine(property.Name + " = " + property.Value);
            }
            // End snippet
        }
Exemplo n.º 16
0
        public void GetCustomProjectMetadata_Validations()
        {
            var client = MetadataClient.Create();

            Assert.Throws <ArgumentException>(() => client.GetCustomProjectMetadata(""));
            Assert.Throws <ArgumentException>(() => client.GetCustomProjectMetadata("a b"));
            Assert.Throws <ArgumentException>(() => client.GetCustomProjectMetadata("a^b"));
            Assert.Throws <ArgumentException>(() => client.GetCustomProjectMetadata(
                                                  "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"));

            Assert.ThrowsAsync <ArgumentException>(() => client.GetCustomProjectMetadataAsync(""));
            Assert.ThrowsAsync <ArgumentException>(() => client.GetCustomProjectMetadataAsync("a b"));
            Assert.ThrowsAsync <ArgumentException>(() => client.GetCustomProjectMetadataAsync("a^b"));
            Assert.ThrowsAsync <ArgumentException>(() => client.GetCustomProjectMetadataAsync(
                                                       "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"));
        }
Exemplo n.º 17
0
        public void WaitForChange_Validations()
        {
            var client = MetadataClient.Create();

            Assert.Throws <ArgumentException>(() => client.WaitForChange("a b"));
            Assert.Throws <ArgumentException>(() => client.WaitForChange("a?b"));
            Assert.Throws <ArgumentException>(() => client.WaitForChange("http://www.google.com"));
            Assert.Throws <ArgumentException>(() => client.WaitForChange("instance", lastETag: "bad-etag"));
            Assert.Throws <ArgumentException>(() => client.WaitForChange("instance", timeout: TimeSpan.FromSeconds(-1)));

            Assert.ThrowsAsync <ArgumentException>(() => client.WaitForChangeAsync("a b"));
            Assert.ThrowsAsync <ArgumentException>(() => client.WaitForChangeAsync("a?b"));
            Assert.ThrowsAsync <ArgumentException>(() => client.WaitForChangeAsync("http://www.google.com"));
            Assert.ThrowsAsync <ArgumentException>(() => client.WaitForChangeAsync("instance", lastETag: "bad-etag"));
            Assert.ThrowsAsync <ArgumentException>(() => client.WaitForChangeAsync("instance", timeout: TimeSpan.FromSeconds(-1)));
        }
Exemplo n.º 18
0
        public async Task WaitForChange()
        {
            const string newValue = "foo";
            string       key      = _fixture.GenerateCustomKey();

            await _fixture.UpdateMetadataAsync($"instance/attributes/{key}", "initial value");

            var task = Task.Run(async() =>
            {
                await Task.Delay(TimeSpan.FromSeconds(2));
                await _fixture.UpdateMetadataAsync($"instance/attributes/{key}", newValue);
            });

            // TODO: This pattern to get the original ETag seems messy. Maybe add something to get an ETag.

            // Snippet: WaitForChange
            MetadataClient client = MetadataClient.Create();

            // Get the original ETag so we know when the metadata changes.
            string lastETag = client.WaitForChange("instance/attributes", timeout: TimeSpan.FromMilliseconds(1)).ETag;

            WaitForChangeResult result;

            while (true)
            {
                // Wait in 30 second blocks until the value actually changes.
                result = client.WaitForChange("instance/attributes", lastETag, TimeSpan.FromSeconds(30));
                if (result.ETag != lastETag)
                {
                    JObject currentCustomMetadata = JObject.Parse(result.Content);
                    foreach (JProperty customMetadata in currentCustomMetadata.Properties())
                    {
                        Console.WriteLine(customMetadata.Name + " = " + customMetadata.Value);
                    }
                    break;
                }
            }
            // End snippet

            dynamic obj = JsonConvert.DeserializeObject(result.Content);

            Assert.Equal(newValue, obj[key].Value);
            await task;
        }
Exemplo n.º 19
0
        public void GetInstanceMetadata()
        {
            var client   = MetadataClient.Create();
            var instance = client.GetInstanceMetadata();

            Assert.Equal("Intel Haswell", instance.CpuPlatform);
            Assert.Equal("Fake instance for metadata server emulator", instance.Description);
            Assert.Equal("boot", instance.Disks[0].DeviceName);
            Assert.Equal(0, instance.Disks[0].Index);
            Assert.Equal("READ_WRITE", instance.Disks[0].Mode);
            Assert.Equal("PERSISTENT", instance.Disks[0].Type);
            Assert.Equal(67890ul, instance.Id.Value);
            Assert.Equal("projects/12345/machineTypes/n1-standard-1", instance.MachineType);
            Assert.True(instance.Metadata.Items.Count >= 1);
            Assert.Equal("my_instance_value1", instance.Metadata.Items.FirstOrDefault(i => i.Key == "my_instance_key1")?.Value);
            Assert.Equal("name.project.google.com.internal", instance.Name);
            Assert.Equal(1, instance.NetworkInterfaces.Count);
            Assert.Equal(1, instance.NetworkInterfaces[0].AccessConfigs.Count);
            Assert.Equal("0.0.0.0", instance.NetworkInterfaces[0].AccessConfigs[0].NatIP);
            Assert.Equal("ONE_TO_ONE_NAT", instance.NetworkInterfaces[0].AccessConfigs[0].Type);
            Assert.Equal("projects/12345/networks/default", instance.NetworkInterfaces[0].Network);
            Assert.Equal("0.0.0.0", instance.NetworkInterfaces[0].NetworkIP);
            Assert.Equal(true, instance.Scheduling.AutomaticRestart);
            Assert.Equal("MIGRATE", instance.Scheduling.OnHostMaintenance);
            Assert.Equal(false, instance.Scheduling.Preemptible);
            Assert.Equal(2, instance.ServiceAccounts.Count);
            Assert.Equal("*****@*****.**", instance.ServiceAccounts[0].Email);
            Assert.Equal(2, instance.ServiceAccounts[0].Scopes.Count);
            Assert.Equal("https://www.googleapis.com/auth/cloud-platform", instance.ServiceAccounts[0].Scopes[0]);
            Assert.Equal("https://www.googleapis.com/auth/userinfo.email", instance.ServiceAccounts[0].Scopes[1]);
            Assert.Equal("default", instance.ServiceAccounts[1].Email);
            Assert.Equal(2, instance.ServiceAccounts[1].Scopes.Count);
            Assert.Equal("https://www.googleapis.com/auth/cloud-platform", instance.ServiceAccounts[1].Scopes[0]);
            Assert.Equal("https://www.googleapis.com/auth/userinfo.email", instance.ServiceAccounts[1].Scopes[1]);
            Assert.Equal(3, instance.Tags.Items.Count);
            Assert.Equal("a", instance.Tags.Items[0]);
            Assert.Equal("b", instance.Tags.Items[1]);
            Assert.Equal("c", instance.Tags.Items[2]);
            Assert.Equal("projects/12345/zones/us-central1-f", instance.Zone);
        }
Exemplo n.º 20
0
        public async Task ProjectMetadataChanged()
        {
            const string newValue = "foo";
            string       key      = _fixture.GenerateCustomKey();
            await _fixture.UpdateMetadataAsync($"project/attributes/{key}", "initial value");

            var client = MetadataClient.Create();

            var waitHandle = new ManualResetEventSlim(false);
            int eventCount = 0;

            client.ProjectMetadataChanged += (s, e) =>
            {
                eventCount++;
                waitHandle.Set();
            };

            await _fixture.UpdateMetadataAsync($"project/attributes/{key}", newValue);

            waitHandle.Wait(TimeSpan.FromSeconds(10));
            Assert.Equal(1, eventCount);
            Assert.Equal(newValue, await client.GetCustomProjectMetadataAsync(key));
        }
Exemplo n.º 21
0
        public void WaitForChange()
        {
            const string newValue = "foo";
            string       key      = _fixture.GenerateCustomKey();

            var task = Task.Run(async() =>
            {
                await Task.Delay(TimeSpan.FromSeconds(1));
                await _fixture.UpdateMetadataAsync($"instance/attributes/{key}", newValue);
            });

            try
            {
                var     client = MetadataClient.Create();
                var     result = client.WaitForChange("instance/attributes");
                dynamic obj    = JsonConvert.DeserializeObject(result.Content);
                Assert.Equal(newValue, obj[key].Value);
                Assert.NotNull(result.ETag);
            }
            finally
            {
                task.Wait();
            }
        }
        protected MetadataFixtureBase()
        {
            var typeInfo = typeof(MetadataFixtureBase).GetTypeInfo();

            emulatorPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
            Directory.CreateDirectory(emulatorPath);

            Func <string, string> copyResource = name =>
            {
                var destination = Path.Combine(emulatorPath, name);
                using (var input = typeInfo.Assembly.GetManifestResourceStream($"{typeInfo.Namespace}.Emulator.{name}"))
                    using (var output = File.Create(destination))
                    {
                        input.CopyTo(output);
                        return(destination);
                    }
            };

            copyResource("common.py");
            copyResource("initial_data.json");
            var emulatorFilePath = copyResource("metadata_server.py");

            var temp = new TcpListener(IPAddress.Loopback, 0);

            temp.Start();
            int port = ((IPEndPoint)temp.LocalEndpoint).Port;

            temp.Stop();

            emulatorHost = $"localhost:{port}";
            Environment.SetEnvironmentVariable(EmulatorEnvironmentVariable, emulatorHost);

            var startInfo = new ProcessStartInfo("python", $"{emulatorFilePath} --test --port {port}");

            startInfo.RedirectStandardError  = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.UseShellExecute        = false;
            emulatorProcess = new Process {
                StartInfo = startInfo, EnableRaisingEvents = true
            };
            emulatorProcess.Exited             += EmulatorProcess_Exited;
            emulatorProcess.OutputDataReceived += (sender, e) =>
            {
                if (e.Data != null)
                {
                    emulatorOutput.AppendLine(e.Data);
                }
            };
            emulatorProcess.ErrorDataReceived += (sender, e) =>
            {
                if (e.Data != null)
                {
                    emulatorErrorOutput.AppendLine(e.Data);
                }
            };
            emulatorProcess.Start();
            emulatorProcess.BeginOutputReadLine();
            emulatorProcess.BeginErrorReadLine();

            // Block until the server becomes available.
            var client = MetadataClient.Create();
            var sw     = Stopwatch.StartNew();

            while (!client.IsServerAvailable() && sw.Elapsed.TotalSeconds < 30)
            {
                Thread.Sleep(50);
            }

            if (!client.IsServerAvailable())
            {
                Cleanup();
                ThrowEmulatorError("The metadata server emulator failed to start");
            }
        }
Exemplo n.º 23
0
        public void IsServerAvailable()
        {
            var client = MetadataClient.Create();

            Assert.True(client.IsServerAvailable());
        }