public async Task GetDefaultQuotas()
        {
            using (var httpTest = new HttpTest())
            {
                httpTest.RespondWith(JObject.Parse(@"
{
  'quota_set': {
    'injected_file_content_bytes': 10240,
    'metadata_items': 128,
    'server_group_members': 10,
    'server_groups': 10,
    'ram': 51200,
    'floating_ips': 10,
    'key_pairs': 100,
    'id': 'defaults',
    'instances': 10,
    'security_group_rules': 20,
    'injected_files': 5,
    'cores': 20,
    'fixed_ips': -1,
    'injected_file_path_bytes': 255,
    'security_groups': 10
  }
}").ToString());

                var quotas = await _compute.GetDefaultQuotasAsync();

                httpTest.ShouldHaveCalled("*/os-quota-sets/defaults");
                Assert.NotNull(quotas);

                Assert.Equal(100, quotas.KeyPairs);
                Assert.Equal(-1, quotas.FixedIPs);
            }
        }
        public void GetVolumeSnapshot()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier snapshotId = Guid.NewGuid();
                httpTest.RespondWithJson(new VolumeSnapshot { Id = snapshotId });

                var result = _compute.GetVolumeSnapshot(snapshotId);

                httpTest.ShouldHaveCalled($"*/os-snapshots/{snapshotId}");
                Assert.NotNull(result);
                Assert.Equal(snapshotId, result.Id);
            }
        }
        public void GetNetwork()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                httpTest.RespondWithJson(new Network { Id = networkId });

                var network = _networkingService.GetNetwork(networkId);

                httpTest.ShouldHaveCalled("*/networks/" + networkId);
                Assert.NotNull(network);
                Assert.Equal(networkId, network.Id);
            }
        }
        public void GetConsole()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverId = Guid.NewGuid();
                httpTest.RespondWithJson(new Console {Type = RemoteConsoleType.NoVnc});

                Console result = _computeService.GetConsole(serverId, ConsoleProtocol.VNC, RemoteConsoleType.NoVnc);
                
                httpTest.ShouldHaveCalled($"*/servers/{serverId}/remote-consoles");
                Assert.NotNull(result);
                Assert.Equal(RemoteConsoleType.NoVnc, result.Type);
            }
        }
        public void CreateServerGroup()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverGroupId = Guid.NewGuid();
                httpTest.RespondWithJson(new ServerGroup {Id = serverGroupId});

                var request = new ServerGroupDefinition("{name}", "{policy-name}");
                var result = _compute.CreateServerGroup(request);

                httpTest.ShouldHaveCalled("*/os-server-groups");
                Assert.Equal(serverGroupId, result.Id);
                Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
            }
        }
        public void GetServerGroup()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverGroupId = Guid.NewGuid();
                httpTest.RespondWithJson(new ServerGroup { Id = serverGroupId });

                var result = _compute.GetServerGroup(serverGroupId);

                httpTest.ShouldHaveCalled($"*/os-server-groups/{serverGroupId}");
                Assert.NotNull(result);
                Assert.Equal(serverGroupId, result.Id);
                Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
            }
        }
        public void CreateVolume()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier volumeId = Guid.NewGuid();
                httpTest.RespondWithJson(new Volume {Id = volumeId});

                var request = new VolumeDefinition(size: 1);
                var result = _compute.CreateVolume(request);

                httpTest.ShouldHaveCalled("*/os-volumes");
                Assert.Equal(volumeId, result.Id);
                Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
            }
        }
        public void ListSubnets()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier subnetId = Guid.NewGuid();
                httpTest.RespondWithJson(new SubnetCollection(new[] {new Subnet {Id = subnetId}}));

                var subnets = _networkingService.ListSubnets();

                httpTest.ShouldHaveCalled("*/subnets");
                Assert.NotNull(subnets);
                Assert.Equal(1, subnets.Count());
                Assert.Equal(subnetId, subnets.First().Id);
            }
        }
        public void ListNetworks()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                httpTest.RespondWithJson(new NetworkCollection(new[] {new Network {Id = networkId}}));

                var networks = _networkingService.ListNetworks();

                httpTest.ShouldHaveCalled("*/networks");
                Assert.NotNull(networks);
                Assert.Equal(1, networks.Count());
                Assert.Equal(networkId, networks.First().Id);
            }
        }
        public void GetRouter()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier routerId = Guid.NewGuid();
                httpTest.RespondWithJson(new Router { Id = routerId });

                var result = _networking.GetRouter(routerId);

                httpTest.ShouldHaveCalled($"*/routers/{routerId}");
                Assert.NotNull(result);
                Assert.Equal(routerId, result.Id);
                Assert.IsType<NetworkingApiBuilder>(((IServiceResource)result).Owner);
            }
        }
        public void CreateNetwork()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                httpTest.RespondWithJson(new Network{Id = networkId});

                var definition = new NetworkDefinition();
                var network = _networkingService.CreateNetwork(definition);

                httpTest.ShouldHaveCalled("*/networks");
                Assert.NotNull(network);
                Assert.Equal(networkId, network.Id);
            }
        }
        public void GetVolume()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier volumeId = Guid.NewGuid();
                httpTest.RespondWithJson(new Volume { Id = volumeId });

                var result = _compute.GetVolume(volumeId);

                httpTest.ShouldHaveCalled($"*/os-volumes/{volumeId}");
                Assert.NotNull(result);
                Assert.Equal(volumeId, result.Id);
                Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
            }
        }
        public void CreateSubnet()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                Identifier subnetId = Guid.NewGuid();
                httpTest.RespondWithJson(new Subnet { Id = subnetId });

                var definition = new SubnetCreateDefinition(networkId, IPVersion.IPv4, "10.0.0.0/24");
                var subnet = _networkingService.CreateSubnet(definition);
                
                httpTest.ShouldHaveCalled("*/subnets");
                Assert.NotNull(subnet);
                Assert.Equal(subnetId, subnet.Id);
            }
        }
        public void CreateNetworks()
        {
            using (var httpTest = new HttpTest())
            {
                httpTest.RespondWithJson(new NetworkCollection(new[] { new Network { Name = "network-1"}, new Network{Name = "network-2"} }));

                var definitions = new[] {new NetworkDefinition(), new NetworkDefinition()};
                var networks = _networkingService.CreateNetworks(definitions);

                httpTest.ShouldHaveCalled("*/networks");
                Assert.NotNull(networks);
                Assert.Equal(2, networks.Count());
                Assert.Equal("network-1", networks.First().Name);
                Assert.Equal("network-2", networks.Last().Name);
            }
        }
        public void CreateServer()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverId = Guid.NewGuid();
                httpTest.RespondWithJson(new Server {Id = serverId});

                var definition = new ServerCreateDefinition("{name}", Guid.NewGuid(), "{flavor-id}");
                var result = _compute.CreateServer(definition);

                httpTest.ShouldHaveCalled("*/servers");
                Assert.NotNull(result);
                Assert.Equal(serverId,result.Id);
                Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
            }
        }
        public async Task EvacuateServer()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverId = Guid.NewGuid();
                httpTest.RespondWithJson(new Server { Id = serverId });
                httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, boss");

                var server = _compute.GetServer(serverId);
                await server.EvacuateAsync(new EvacuateServerRequest(false));

                httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
                string lastRequest = httpTest.CallLog.Last().RequestBody;
                Assert.True(lastRequest.Contains("evacuate"));
            }
        }
        public void CreatePort()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                Identifier portId = Guid.NewGuid();
                httpTest.RespondWithJson(new Port { Id = portId });

                var definition = new PortCreateDefinition(networkId);
                var port = _networkingService.CreatePort(definition);

                httpTest.ShouldHaveCalled("*/ports");
                Assert.NotNull(port);
                Assert.Equal(portId, port.Id);
            }
        }
        public void CreateRouter()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                Identifier routerId = Guid.NewGuid();
                httpTest.RespondWithJson(new Router { Id = routerId, ExternalGateway = new ExternalGateway { ExternalNetworkId = networkId } });

                var definition = new RouterCreateDefinition();
                var result = _networking.CreateRouter(definition);

                httpTest.ShouldHaveCalled("*/routers");
                Assert.NotNull(result);
                Assert.Equal(routerId, result.Id);
                Assert.Equal(networkId, result.ExternalGateway.ExternalNetworkId);
                Assert.IsType<NetworkingApiBuilder>(((IServiceResource)result).Owner);
            }
        }
        public void ListServerAddresses()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverId = Guid.NewGuid();
                httpTest.RespondWithJson(new ServerCollection { new Server { Id = serverId } });
                httpTest.RespondWithJson(new ServerAddressCollection {["ServiceNet"] = new List<ServerAddress> {new ServerAddress {IP = "192.168.1.189"}}});

                var serverReferences = _compute.ListServerSummaries();
                var results = serverReferences.First().ListAddresses();

                httpTest.ShouldHaveCalled($"*/servers/{serverId}/ips");
                Assert.NotNull(results);
                Assert.True(results.ContainsKey("ServiceNet"));

                var result = results["ServiceNet"].First();
                Assert.Equal("192.168.1.189", result.IP);
            }
        }
        public void ListServerGroups()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverGroupId = Guid.NewGuid();
                httpTest.RespondWithJson(new ServerGroupCollection
                {
                    new ServerGroup {Id = serverGroupId}
                });

                var results = _compute.ListServerGroups();

                httpTest.ShouldHaveCalled("*/os-server-groups");
                Assert.Equal(1, results.Count());
                var result = results.First();
                Assert.Equal(serverGroupId, result.Id);
                Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
            }
        }
        public void ListRouters()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier routerId = Guid.NewGuid();
                httpTest.RespondWithJson(new RouterCollection
                {
                    new Router { Id = routerId }
                });

                var results = _networking.ListRouters(new RouterListOptions { Status = RouterStatus.Active });

                httpTest.ShouldHaveCalled("*/routers?status=ACTIVE");
                Assert.Equal(1, results.Count());
                var result = results.First();
                Assert.Equal(routerId, result.Id);
                Assert.IsType<NetworkingApiBuilder>(((IServiceResource)result).Owner);
            }
        }
        public void CreatePorts()
        {
            using (var httpTest = new HttpTest())
            {
                httpTest.RespondWithJson(new PortCollection(new[] {new Port {Name = "port-1"}, new Port {Name = "port-2"}}));

                Identifier networkId = Guid.NewGuid();
                var definitions = new[]
                {
                    new PortCreateDefinition(networkId),
                    new PortCreateDefinition(networkId)
                };
                var ports = _networkingService.CreatePorts(definitions);

                httpTest.ShouldHaveCalled("*/ports");
                Assert.NotNull(ports);
                Assert.Equal(2, ports.Count());
                Assert.Equal("port-1", ports.First().Name);
                Assert.Equal("port-2", ports.Last().Name);
            }
        }
        public void CreateSubnets()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                httpTest.RespondWithJson(new SubnetCollection(new[] { new Subnet { Name = "subnet-1" }, new Subnet { Name = "subnet-2" } }));

                var definitions = new[]
                {
                    new SubnetCreateDefinition(networkId, IPVersion.IPv4, "{cidr-1}"),
                    new SubnetCreateDefinition(networkId, IPVersion.IPv6, "{cidr-2}")
                };
                var subnets = _networkingService.CreateSubnets(definitions);

                httpTest.ShouldHaveCalled("*/subnets");
                Assert.NotNull(subnets);
                Assert.Equal(2, subnets.Count());
                Assert.Equal("subnet-1", subnets.First().Name);
                Assert.Equal("subnet-2", subnets.Last().Name);
            }
        }
        public void GetServerAddress()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier serverId = Guid.NewGuid();
                httpTest.RespondWithJson(new ServerCollection { new Server { Id = serverId } });
                httpTest.RespondWithJson(new Dictionary<string, IList<ServerAddress>>
                {
                    ["private"] = new List<ServerAddress>
                    {
                        new ServerAddress {IP = "1.2.3.4"}
                    }
                });

                var serverReferences = _compute.ListServerSummaries();
                var result = (serverReferences.First().GetAddress("private")).First();

                httpTest.ShouldHaveCalled($"*/servers/{serverId}/ips/private");
                Assert.NotNull(result);
                Assert.Equal("1.2.3.4", result.IP);
            }
        }
        public void DeleteNetwork()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                httpTest.RespondWith((int)HttpStatusCode.NoContent, "All gone!");

                _networkingService.DeleteNetwork(networkId);

                httpTest.ShouldHaveCalled("*/networks/" + networkId);
            }
        }
        public void ListSecurityGroupRules()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier securityGroupId = Guid.NewGuid();
                Identifier securityGroupRuleId = Guid.NewGuid();
                httpTest.RespondWithJson(new SecurityGroupRuleCollection
                {
                    new SecurityGroupRule {Id = securityGroupRuleId, SecurityGroupId = securityGroupId}
                });

                var results = _networking.ListSecurityGroupRules();

                httpTest.ShouldHaveCalled("*/security-group-rules");
                Assert.Equal(1, results.Count());
                var result = results.First();
                Assert.Equal(securityGroupRuleId, result.Id);
                Assert.Equal(securityGroupId, result.SecurityGroupId);
            }
        }
        public void DeleteRouter(HttpStatusCode responseCode)
        {
            using (var httpTest = new HttpTest())
            {
                Identifier portId = Guid.NewGuid();
                Identifier routerId = Guid.NewGuid();
                httpTest.RespondWithJson(new Router { Id = routerId});
                httpTest.RespondWithJson(new PortCollection
                {
                    new Port {Id = portId}
                });
                httpTest.RespondWith((int)responseCode, "All gone!");

                var router = _networking.GetRouter(routerId);
                router.Delete();

                httpTest.ShouldHaveCalled($"*/routers/{routerId}/remove_router_interface");
                httpTest.ShouldHaveCalled($"*/routers/{routerId}");
            }
        }
        public void WhenDeleteNetwork_Returns404NotFound_ShouldConsiderRequestSuccessful()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier networkId = Guid.NewGuid();
                httpTest.RespondWith((int)HttpStatusCode.NotFound, "Not here, boss...");

                _networkingService.DeleteNetwork(networkId);

                httpTest.ShouldHaveCalled("*/networks/" + networkId);
            }
        }
        public void UpdateSubnet()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier subnetId = Guid.NewGuid();
                httpTest.RespondWithJson(new Subnet { Id = subnetId });

                var definition = new SubnetUpdateDefinition { Name = "new subnet name" };
                var subnet = _networkingService.UpdateSubnet(subnetId, definition);

                httpTest.ShouldHaveCalled("*/subnets/" + subnetId);
                Assert.NotNull(subnet);
                Assert.Equal(subnetId, subnet.Id);
            }
        }
        public void GetSubnets()
        {
            using (var httpTest = new HttpTest())
            {
                Identifier subnetId = Guid.NewGuid();
                httpTest.RespondWithJson(new Subnet { Id = subnetId });

                var subnet = _networkingService.GetSubnet(subnetId);

                httpTest.ShouldHaveCalled("*/subnets/" + subnetId);
                Assert.NotNull(subnet);
                Assert.Equal(subnetId, subnet.Id);
            }
        }