Пример #1
0
        public async Task WhenSetClientConnectionEncryptionLevelSetToLow_ThenConnectionSucceeds(
            [WindowsInstance(InitializeScript = @"
                & reg add ""HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"" /t REG_DWORD /v MinEncryptionLevel /d 1 /f | Out-Default
            ")] InstanceRequest testInstance,
            [Credential] CredentialRequest credential)
        {
            await testInstance.AwaitReady();

            using (var tunnel = RdpTunnel.Create(
                       testInstance.Locator,
                       await credential.GetCredentialAsync()))
            {
                var session = await Connect(tunnel, testInstance.Locator);

                AwaitEvent <RemoteDesktopConnectionSuceededEvent>();
                Assert.IsNull(this.ExceptionShown);

                RemoteDesktopWindowClosedEvent expectedEvent = null;

                this.serviceProvider.GetService <IEventService>()
                .BindHandler <RemoteDesktopWindowClosedEvent>(e =>
                {
                    expectedEvent = e;
                });

                Delay(TimeSpan.FromSeconds(5));
                session.Close();

                Assert.IsNotNull(expectedEvent);
            }
        }
Пример #2
0
        public async Task WhenServerClosesConnectionMultipleHttpRequests_ThenRelayEnds(
            [LinuxInstance(InitializeScript = InstallApache)] InstanceRequest vm)
        {
            await vm.AwaitReady();

            var stream = ConnectToWebServer(vm.InstanceReference);

            for (int i = 0; i < 3; i++)
            {
                byte[] request = new ASCIIEncoding().GetBytes(
                    $"GET /?_={i} HTTP/1.1\r\nHost:www\r\nConnection: keep-alive\r\n\r\n");
                await stream.WriteAsync(request, 0, request.Length, this.tokenSource.Token);

                byte[] buffer = new byte[stream.MinReadSize];

                var response = new HttpResponseAccumulator();
                int bytesRead;
                while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length, this.tokenSource.Token)) > 0)
                {
                    response.Accumulate(buffer, 0, bytesRead);

                    if (response.IsComplete)
                    {
                        TraceSources.Compute.TraceVerbose("Got full response");
                        break;
                    }
                }

                Assert.AreEqual(response.ExpectedBytes, response.TotalBytesRead);
            }

            await stream.CloseAsync(this.tokenSource.Token);
        }
        public async Task WhenCredentialsInvalid_ThenErrorIsShownAndWindowIsClosed(
            [WindowsInstance] InstanceRequest testInstance,
            [Credential] CredentialRequest credential)
        {
            await testInstance.AwaitReady();

            using (var tunnel = RdpTunnel.Create(
                       testInstance.Locator,
                       await credential.GetCredentialAsync()))
            {
                var rdpService = new RemoteDesktopService(this.serviceProvider);
                var session    = rdpService.Connect(
                    testInstance.Locator,
                    "localhost",
                    (ushort)tunnel.LocalPort,
                    new VmInstanceConnectionSettings()
                {
                    Username                   = "******",
                    Password                   = SecureStringExtensions.FromClearText("wrong"),
                    AuthenticationLevel        = RdpAuthenticationLevel.NoServerAuthentication,
                    UserAuthenticationBehavior = RdpUserAuthenticationBehavior.AbortOnFailure,
                    DesktopSize                = RdpDesktopSize.ClientSize
                });

                AwaitEvent <RemoteDesktopConnectionFailedEvent>();
                Assert.IsNotNull(this.ExceptionShown);
                Assert.IsInstanceOf(typeof(RdpDisconnectedException), this.ExceptionShown);
                Assert.AreEqual(2055, ((RdpDisconnectedException)this.ExceptionShown).DisconnectReason);
            }
        }
Пример #4
0
        public async Task WhenUsingExistingKey_ThenAddMetadataSucceeds(
            [WindowsInstance] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            var key = Guid.NewGuid().ToString();

            await this.instancesResource.AddMetadataAsync(
                testInstance.InstanceReference,
                key,
                "value to be overridden",
                CancellationToken.None);

            var value = "metadata value";

            await this.instancesResource.AddMetadataAsync(
                testInstance.InstanceReference,
                key,
                value,
                CancellationToken.None);

            var instance = await this.instancesResource.Get(
                testInstance.InstanceReference.ProjectId,
                testInstance.InstanceReference.Zone,
                testInstance.InstanceReference.Name)
                           .ExecuteAsync(CancellationToken.None)
                           .ConfigureAwait(false);

            Assert.AreEqual(
                value,
                instance.Metadata.Items.First(i => i.Key == key).Value);
        }
Пример #5
0
        public async Task WhenServerClosesConnectionAfterSingleHttpRequest_ThenRelayEnds(
            [LinuxInstance(InitializeScript = InstallApache)] InstanceRequest vm)
        {
            await vm.AwaitReady();

            var stream = ConnectToWebServer(vm.InstanceReference);

            byte[] request = new ASCIIEncoding().GetBytes(
                "GET / HTTP/1.0\r\n\r\n");
            await stream.WriteAsync(request, 0, request.Length, this.tokenSource.Token);

            byte[] buffer = new byte[stream.MinReadSize];

            var response = new HttpResponseAccumulator();
            int bytesRead;

            while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length, this.tokenSource.Token)) > 0)
            {
                response.Accumulate(buffer, 0, bytesRead);
            }

            await stream.CloseAsync(this.tokenSource.Token);

            Assert.AreEqual(response.ExpectedBytes, response.TotalBytesRead);
        }
Пример #6
0
        public async Task WhenConnectingWithInvalidAccessToken_ThenReadingFailsWithUnauthorizedException
            ([LinuxInstance(InitializeScript = InstallApache)] InstanceRequest vm)
        {
            await vm.AwaitReady();

            // NB. Fiddler might cause this test to fail.

            byte[] request = new ASCIIEncoding().GetBytes(
                "GET / HTTP/1.0\r\n\r\n");

            var stream = new SshRelayStream(
                new IapTunnelingEndpoint(
                    GoogleCredential.FromAccessToken("invalid"),
                    vm.Locator,
                    80,
                    IapTunnelingEndpoint.DefaultNetworkInterface,
                    TestProject.UserAgent));

            await stream.WriteAsync(request, 0, request.Length, CancellationToken.None);

            AssertEx.ThrowsAggregateException <UnauthorizedException>(() =>
            {
                byte[] buffer = new byte[64 * 1024];
                stream.ReadAsync(buffer, 0, buffer.Length, CancellationToken.None).Wait();
            });
        }
Пример #7
0
        public async Task DoDeregisterService(string serviceName, string groupName, Instance instance)
        {
            var request = new InstanceRequest(namespaceId, serviceName, groupName, NamingRemoteConstants.DE_REGISTER_INSTANCE, instance);

            await RequestToServer <CommonResponse>(request).ConfigureAwait(false);

            _redoService.RemoveInstanceForRedo(serviceName, groupName);
        }
Пример #8
0
        public async Task DeregisterService(string serviceName, string groupName, Instance instance)
        {
            _logger?.LogInformation("[DEREGISTER-SERVICE] {0} deregistering service {1} with instance {2}", namespaceId, serviceName, instance);

            var request = new InstanceRequest(namespaceId, serviceName, groupName, NamingRemoteConstants.DE_REGISTER_INSTANCE, instance);

            await RequestToServer <CommonResponse>(request);

            namingGrpcConnectionEventListener.RemoveInstanceForRedo(serviceName, groupName, instance);
        }
Пример #9
0
            public bool RemoveInstance(string instanceId)
            {
                var request = new InstanceRequest
                {
                    Id = instanceId
                };
                var response = _messageBus.Request <InstanceRequest, InstanceResponse>(InstanceRequest.ChannelDelete, request);

                return(response.IsSuccess);
            }
        public async Task WhenSwitchingToStoppedInstanceNode_ThenControlsAreDisabled(
            [WindowsInstance] InstanceRequest testInstance)
        {
            var node = await CreateNode(testInstance, false);

            await this.viewModel.SwitchToModelAsync(node);

            Assert.IsFalse(this.viewModel.IsEnableTailingButtonEnabled);
            Assert.IsFalse(this.viewModel.IsOutputBoxEnabled);
        }
Пример #11
0
            public bool StopInstance(string instanceId)
            {
                var request = new InstanceRequest
                {
                    Id = instanceId
                };
                var response = _messageBus.RequestWait <InstanceRequest, InstanceResponse>(InstanceRequest.ChannelStop, request);

                return(response.IsSuccess);
            }
Пример #12
0
 public static UIScreen ReplayScreen(Action <List <XMLMenu.CacheInstruction> > cacheTentative, Action cacheConfirm) =>
 new LazyUIScreen(() => SaveData.p.ReplayData.Count.Range().Select(i =>
                                                                   new CacheNavigateUINode(cacheTentative, () =>
                                                                                           SaveData.p.ReplayData.TryN(i)?.metadata.Record.AsDisplay(true, true) ?? generic_deleted,
                                                                                           new FuncNode(() => {
     cacheConfirm();
     return(InstanceRequest.ViewReplay(SaveData.p.ReplayData.TryN(i)));
 }, replay_view),
                                                                                           new ConfirmFuncNode(() => SaveData.p.TryDeleteReplay(i), delete, true)
                                                                                           ).With(monospaceClass).With(small2Class)
                                                                   ).ToArray());
        public async Task WhenSwitchingToRunningInstanceNode_ThenOutputIsPopulated(
            [WindowsInstance] InstanceRequest testInstance)
        {
            var node = await CreateNode(testInstance, true);

            await this.viewModel.SwitchToModelAsync(node);

            Assert.IsTrue(this.viewModel.IsEnableTailingButtonEnabled);
            Assert.IsTrue(this.viewModel.IsOutputBoxEnabled);
            StringAssert.Contains("Instance setup finished", this.viewModel.Output);
        }
        public async Task WhenBlocked_ThenEnableHasNoImpactOnTailing(
            [WindowsInstance] InstanceRequest testInstance)
        {
            var node = await CreateNode(testInstance, true);

            await this.viewModel.SwitchToModelAsync(node);

            this.viewModel.IsTailBlocked = true;
            this.viewModel.IsTailEnabled = true;

            Assert.IsNull(this.viewModel.TailCancellationTokenSource, "not tailing yet");
        }
Пример #15
0
        public async Task WhenSwitchingToStoppedInstanceNode_ThenControlsAreDisabled(
            [WindowsInstance] InstanceRequest testInstance,
            [Credential(Role = PredefinedRole.ComputeViewer)] CredentialRequest credential)
        {
            var viewModel = CreateViewModel(await credential.GetCredentialAsync());
            var node      = await CreateNode(testInstance, false);

            await viewModel.SwitchToModelAsync(node);

            Assert.IsFalse(viewModel.IsEnableTailingButtonEnabled);
            Assert.IsFalse(viewModel.IsOutputBoxEnabled);
            StringAssert.Contains(SerialOutputViewModel.DefaultWindowTitle, viewModel.WindowTitle);
        }
Пример #16
0
 private void OperateAWSServer(InstanceRequest instanceRequest, ILambdaContext context, ref bool actionSucceeded, ref string actionMessage)
 {
     try
     {
         serverOperationsHelper.InstanceRequestObj = instanceRequest;
         serverOperationsHelper.updateInstanceIdFromName();
         instanceRequest = serverOperationsHelper.ServerOperation(ref actionSucceeded, ref actionMessage);
     }
     catch (Exception ex)
     {
         context.Logger.LogLine($"StartServerIntentProcessor::OperateAWSServer => {ex.Message}");
         context.Logger.LogLine($"StartServerIntentProcessor::OperateAWSServer => {ex.StackTrace}");
     }
 }
Пример #17
0
 private void TryInferSlots(InstanceRequest instanceRequest, InstanceRequest previousRequest)
 {
     if (previousRequest != null)
     {
         if (string.IsNullOrEmpty(instanceRequest.InstanceName) && !string.IsNullOrEmpty(previousRequest.InstanceName))
         {
             instanceRequest.InstanceName = previousRequest.InstanceName;
         }
         if (string.IsNullOrEmpty(instanceRequest.InstanceAction) && !string.IsNullOrEmpty(previousRequest.InstanceAction))
         {
             instanceRequest.InstanceAction = previousRequest.InstanceAction;
         }
     }
 }
Пример #18
0
        public async Task WhenLoadAsyncCompletes_ThenOutputContainsExistingData(
            [WindowsInstance] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            var model = await SerialOutputModel.LoadAsync(
                new ComputeEngineAdapter(Defaults.GetCredential()),
                await testInstance.GetInstanceAsync(),
                SerialPortStream.ConsolePort,
                CancellationToken.None);

            Assert.IsFalse(string.IsNullOrWhiteSpace(model.Output));
            StringAssert.Contains("Instance setup finished", model.Output);
        }
Пример #19
0
        public async Task WhenBlocked_ThenEnableHasNoImpactOnTailing(
            [WindowsInstance] InstanceRequest testInstance,
            [Credential(Role = PredefinedRole.ComputeViewer)] CredentialRequest credential)
        {
            var viewModel = CreateViewModel(await credential.GetCredentialAsync());
            var node      = await CreateNode(testInstance, true);

            await viewModel.SwitchToModelAsync(node);

            viewModel.IsTailBlocked = true;
            viewModel.IsTailEnabled = true;

            Assert.IsNull(viewModel.TailCancellationTokenSource, "not tailing yet");
        }
        public async Task WhenServerNotListening_ThenReadReturnsZero(
            [LinuxInstance] InstanceRequest vm)
        {
            await vm.AwaitReady();

            var stream = ConnectToWebServer(vm.InstanceReference);

            byte[] request = new ASCIIEncoding().GetBytes(
                $"GET / HTTP/1.1\r\nHost:www\r\nConnection: keep-alive\r\n\r\n");
            await stream.WriteAsync(request, 0, request.Length, CancellationToken.None);

            byte[] buffer = new byte[stream.MinReadSize];
            Assert.AreEqual(0, stream.ReadAsync(buffer, 0, buffer.Length, CancellationToken.None).Result);
        }
        public async Task WhenInstanceCreated_ThenListLogEntriesReturnsInsertEvent(
            [LinuxInstance] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            var instanceRef = await testInstance.GetInstanceAsync();

            var loggingService = new LoggingService(new BaseClientService.Initializer
            {
                HttpClientInitializer = Defaults.GetCredential()
            });

            var startDate = DateTime.UtcNow.AddDays(-30);
            var endDate   = DateTime.UtcNow;

            var request = new ListLogEntriesRequest()
            {
                ResourceNames = new[]
                {
                    "projects/" + Defaults.ProjectId
                },
                Filter = $"resource.type=\"gce_instance\" " +
                         $"AND protoPayload.methodName:{InsertInstanceEvent.Method} " +
                         $"AND timestamp > {startDate:yyyy-MM-dd}",
                PageSize = 1000,
                OrderBy  = "timestamp desc"
            };

            var events          = new List <EventBase>();
            var instanceBuilder = new InstanceSetHistoryBuilder(startDate, endDate);

            // Creating the VM might be quicker than the logs become available.
            for (int retry = 0; retry < 4 && !events.Any(); retry++)
            {
                await loggingService.Entries.ListEventsAsync(
                    request,
                    events.Add,
                    new Apis.Util.ExponentialBackOff());

                if (!events.Any())
                {
                    await Task.Delay(20 * 1000);
                }
            }

            var insertEvent = events.OfType <InsertInstanceEvent>()
                              .First(e => e.InstanceReference == instanceRef);

            Assert.IsNotNull(insertEvent);
        }
Пример #22
0
        public async Task WhenSendingMessagesToEchoServer_MessagesAreReceivedVerbatim(
            [LinuxInstance(InitializeScript = InstallEchoServer)] InstanceRequest vm,
            [Credential] CredentialRequest credential,
            [Values(
                 1,
                 (int)DataMessage.MaxDataLength - 1,
                 (int)DataMessage.MaxDataLength,
                 (int)DataMessage.MaxDataLength + 1,
                 (int)DataMessage.MaxDataLength * 10)] int length,
            [Values(1, 3)] int count)
        {
            var message = new byte[length];

            FillArray(message);

            await vm.AwaitReady();

            var stream = ConnectToEchoServer(
                vm.Locator,
                await credential.GetCredentialAsync());

            for (int i = 0; i < count; i++)
            {
                await stream.WriteAsync(message, 0, message.Length, this.tokenSource.Token);

                var response       = new byte[length];
                int totalBytesRead = 0;
                while (true)
                {
                    var bytesRead = await stream.ReadAsync(
                        response,
                        totalBytesRead,
                        response.Length - totalBytesRead,
                        this.tokenSource.Token);

                    totalBytesRead += bytesRead;

                    if (bytesRead == 0 || totalBytesRead >= length)
                    {
                        break;
                    }
                }

                Assert.AreEqual(length, totalBytesRead);
                Assert.AreEqual(message, response);
            }

            await stream.CloseAsync(this.tokenSource.Token);
        }
Пример #23
0
        public async Task WhenUserDoesntExist_ThenResetPasswordCreatesNewUser(
            [WindowsInstance] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            var username    = "******" + Guid.NewGuid().ToString().Substring(20);
            var credentials = await this.instancesResource.ResetWindowsUserAsync(
                testInstance.Locator,
                username,
                CancellationToken.None);

            Assert.AreEqual(username, credentials.UserName);
            Assert.IsEmpty(credentials.Domain);
            Assert.IsNotEmpty(credentials.Password);
        }
        public async Task WhenUserNotInRole_ThenGetInstanceAsyncThrowsResourceAccessDeniedException(
            [LinuxInstance] InstanceRequest testInstance,
            [Credential(Role = PredefinedRole.IapTunnelUser)] CredentialRequest credential)
        {
            await testInstance.AwaitReady();

            var instanceRef = await testInstance.GetInstanceAsync();

            var adapter = new ComputeEngineAdapter(await credential.GetCredentialAsync());

            AssertEx.ThrowsAggregateException <ResourceAccessDeniedException>(
                () => adapter.GetInstanceAsync(
                    testInstance.Locator,
                    CancellationToken.None).Wait());
        }
        public async Task TestResetPasswordForNonexistingUserSucceeds(
            [WindowsInstance] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            var username    = "******" + Guid.NewGuid().ToString().Substring(20);
            var credentials = await this.instancesResource.ResetWindowsUserAsync(
                testInstance.InstanceReference,
                username,
                CancellationToken.None);

            Assert.AreEqual(username, credentials.UserName);
            Assert.IsEmpty(credentials.Domain);
            Assert.IsNotEmpty(credentials.Password);
        }
Пример #26
0
        public async Task WhenInstanceExistsAndIsListening_ThenProbeSucceeds(
            [WindowsInstance] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            using (var stream = new SshRelayStream(
                       new IapTunnelingEndpoint(
                           Defaults.GetCredential(),
                           testInstance.InstanceReference,
                           3389,
                           IapTunnelingEndpoint.DefaultNetworkInterface)))
            {
                await stream.TestConnectionAsync(TimeSpan.FromSeconds(10));
            }
        }
Пример #27
0
        public async Task WhenInstanceCreated_ThenListLogEntriesReturnsInsertEvent(
            [LinuxInstance] InstanceRequest testInstance,
            [Credential(Role = PredefinedRole.LogsViewer)] CredentialRequest credential)
        {
            await testInstance.AwaitReady();

            var instanceRef = await testInstance.GetInstanceAsync();

            var startDate = DateTime.UtcNow.AddDays(-30);
            var endDate   = DateTime.UtcNow;

            var adapter = new AuditLogAdapter(await credential.GetCredentialAsync());
            var request = new ListLogEntriesRequest()
            {
                ResourceNames = new[]
                {
                    "projects/" + TestProject.ProjectId
                },
                Filter = $"resource.type=\"gce_instance\" " +
                         $"AND protoPayload.methodName:{InsertInstanceEvent.Method} " +
                         $"AND timestamp > {startDate:yyyy-MM-dd}",
                PageSize = 1000,
                OrderBy  = "timestamp desc"
            };

            var events          = new List <EventBase>();
            var instanceBuilder = new InstanceSetHistoryBuilder(startDate, endDate);

            // Creating the VM might be quicker than the logs become available.
            for (int retry = 0; retry < 4 && !events.Any(); retry++)
            {
                await adapter.ListEventsAsync(
                    request,
                    events.Add,
                    new Apis.Util.ExponentialBackOff(),
                    CancellationToken.None);

                if (!events.Any())
                {
                    await Task.Delay(20 * 1000);
                }
            }

            var insertEvent = events.OfType <InsertInstanceEvent>()
                              .First(e => e.InstanceReference == instanceRef);

            Assert.IsNotNull(insertEvent);
        }
Пример #28
0
        public virtual async Task <ActionResult> Update([FromRoute] int id, [FromBody] InstanceRequest request)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var result = await _instanceService.UpdateEntityByIdAsync(request, id);

            if (!result)
            {
                return(StatusCode(500));
            }

            return(NoContent());
        }
Пример #29
0
        public virtual async Task <ActionResult <SampleDto> > Create([FromBody] InstanceRequest request)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var dto = await _instanceService.CreateEntityAsync(request);

            if (dto == null)
            {
                return(StatusCode(500));
            }

            return(Ok(dto));
        }
Пример #30
0
        public async Task WhenSwitchingToRunningInstanceNode_ThenOutputIsPopulated(
            [WindowsInstance] InstanceRequest testInstance,
            [Credential(Role = PredefinedRole.ComputeViewer)] CredentialRequest credential)
        {
            var viewModel = CreateViewModel(await credential.GetCredentialAsync());
            var node      = await CreateNode(testInstance, true);

            await viewModel.SwitchToModelAsync(node);

            Assert.IsTrue(viewModel.IsEnableTailingButtonEnabled);
            Assert.IsTrue(viewModel.IsOutputBoxEnabled);
            StringAssert.Contains("Instance setup finished", viewModel.Output);

            StringAssert.Contains(SerialOutputViewModel.DefaultWindowTitle, viewModel.WindowTitle);
            StringAssert.Contains(testInstance.Locator.Name, viewModel.WindowTitle);
        }