Пример #1
0
 def testCreateConnectUrl(self, target, expected_base, expected_query):
     tunnel_target = utils.IapTunnelTargetInfo(*target)
     created_url = utils.CreateWebSocketConnectUrl(tunnel_target)
     created_url_parts = created_url.split('?', 1)
     self.assertEqual(created_url_parts[0], expected_base)
     self.assertEqual(sorted(created_url_parts[1].split('&')),
                      expected_query)
Пример #2
0
 def _GetTunnelTargetInfo(self):
   proxy_info = http_proxy.GetHttpProxyInfo()
   if callable(proxy_info):
     proxy_info = proxy_info(method='https')
   return utils.IapTunnelTargetInfo(project=self._project,
                                    zone=self._zone,
                                    instance=self._instance,
                                    interface=self._interface,
                                    port=self._port,
                                    url_override=self._iap_tunnel_url_override,
                                    proxy_info=proxy_info)
 def SetUp(self):
   self._received_data = []
   self._close_received = False
   self.tunnel_target = utils.IapTunnelTargetInfo(
       project='project-a', zone='zone-b', instance='instance-c',
       interface='nic0', port=22, url_override=None, proxy_info=None)
   self.iap_tunnel_websocket = iap_tunnel_websocket.IapTunnelWebSocket(
       self.tunnel_target, GetAccessToken, self.DataCallback,
       self.CloseCallback, ignore_certs=True)
   self.iap_tunnel_websocket._websocket_helper = mock.MagicMock()
   self.iap_tunnel_websocket._connect_msg_received = True
Пример #4
0
    def testSimpleCase(self):
        self.make_requests.side_effect = [
            [INSTANCE_WITH_EXTERNAL_ADDRESS],
            [self.v1_messages.Project(name='my-project')],
        ]

        self.Run('compute start-iap-tunnel instance-1 22 --zone zone-1 '
                 '--listen-on-stdin')

        self.CheckRequests([
            (self.compute.instances, 'Get',
             self.messages.ComputeInstancesGetRequest(
                 instance='instance-1', project='my-project', zone='zone-1'))
        ], )

        self.assertEqual(self.c_store_load.call_count, 1)
        self.assertEqual(self.c_store_refresh.call_count, 0)

        # The last call results in no data and signals closing of the connection.
        if platforms.OperatingSystem.IsWindows():
            # Three ReadFile() calls that result in two websocket Send().
            ctypes.windll.kernel32.ReadFile.assert_has_calls(
                [mock.call(mock.ANY, mock.ANY, 16384, mock.ANY, None)] * 3)
            self.assertEqual(ctypes.windll.kernel32.ReadFile.call_count, 3)
        else:
            # Three read() calls that result in two websocket Send().
            self.stdin_mock.read.assert_has_calls([mock.call(16384)] * 3)
            self.assertEqual(self.stdin_mock.read.call_count, 3)

        tunnel_target = iap_tunnel_websocket_utils.IapTunnelTargetInfo(
            project='my-project',
            zone='zone-1',
            instance='instance-1',
            interface='nic0',
            port=22,
            url_override=None,
            proxy_info=None)
        partial_matcher = mock_matchers.TypeMatcher(functools.partial)
        self.websocket_cls_mock.assert_called_once_with(tunnel_target,
                                                        partial_matcher,
                                                        partial_matcher,
                                                        partial_matcher,
                                                        ignore_certs=False)

        self.assertEqual(self.websocket_mock.InitiateConnection.call_count, 1)
        self.websocket_mock.Send.assert_has_calls(
            [mock.call(b'data1'), mock.call(b'data2')])
        self.assertEqual(self.websocket_mock.Send.call_count, 2)
        self.assertEqual(self.websocket_mock.LocalEOF.call_count, 1)
        self.assertEqual(self.websocket_mock.WaitForAllSent.call_count, 1)
        self.assertEqual(self.websocket_mock.Close.call_count, 1)
Пример #5
0
 def _GetTunnelTargetInfo(self):
     proxy_info = http_proxy.GetHttpProxyInfo()
     if callable(proxy_info):
         proxy_info = proxy_info(method='https')
     return utils.IapTunnelTargetInfo(
         project=self._project,
         zone=self._zone,
         instance=self._instance,
         interface=self._interface,
         port=self._port,
         url_override=self._iap_tunnel_url_override,
         proxy_info=proxy_info,
         region=self._region,
         network=self._network,
         host=self._host,
         dest_group=self._dest_group)
Пример #6
0
 def testInit_MissingTargetParam(self, target, expected_error,
                                 expected_message):
     tunnel_target = utils.IapTunnelTargetInfo(*target)
     with self.AssertRaisesExceptionMatches(expected_error,
                                            expected_message):
         utils.ValidateParameters(tunnel_target)
  def testSimpleCase(self, gcloud_cmd):
    self.make_requests.side_effect = [
        [INSTANCE_WITH_EXTERNAL_ADDRESS],
        [self.v1_messages.Project(name='my-project')],
    ]

    self.Run(gcloud_cmd)

    self.CheckRequests(
        [(self.compute.instances,
          'Get',
          self.messages.ComputeInstancesGetRequest(
              instance='instance-1',
              project='my-project',
              zone='zone-1'))],
    )

    self.assertEqual(self.c_store_load.call_count, 2)
    self.assertEqual(self.c_store_refresh.call_count, 0)
    self.assertEqual(self.portpicker_mock.call_count, 1)
    self.socket_getaddrinfo.assert_has_calls([
        mock.call('localhost', 22175, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
                  socket.AI_PASSIVE)])
    self.assertEqual(self.socket_getaddrinfo.call_count, 1)

    # Server socket is created then bind() and listen() followed by select()
    # at least twice -- the first yielding the one connection from accept() call
    # and a later one being interrupted by a raised keyboard exception.
    self.socket_init.assert_has_calls([
        mock.call(socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP),
        mock.call(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)])
    self.assertEqual(self.socket_init.call_count, 2)
    self.socket_mock.bind.assert_has_calls([mock.call(('::1', 22175, 0, 0))])
    self.assertEqual(self.socket_mock.bind.call_count, 1)
    self.socket_mock.listen.assert_has_calls([mock.call(1)])
    self.assertEqual(self.socket_mock.listen.call_count, 1)

    self.socket_mock2.bind.assert_has_calls([mock.call(('127.0.0.1', 22175))])
    self.assertEqual(self.socket_mock2.bind.call_count, 1)
    self.socket_mock2.listen.assert_has_calls([mock.call(1)])
    self.assertEqual(self.socket_mock2.listen.call_count, 1)

    self.select_mock.assert_called_with([self.socket_mock, self.socket_mock2],
                                        (), (), 0.2)
    self.assertTrue(self.select_mock.call_count >= 2)  # pylint:disable=g-generic-assert
    self.socket_mock.accept.assert_has_calls([mock.call()])
    self.assertEqual(self.socket_mock.accept.call_count, 1)
    # Note that other code using socket
    # (e.g. devshell_test_base.AuthReferenceServer) may also make calls to
    # this mock.
    self.socket_mock.close.assert_has_calls([mock.call()])
    self.assertEqual(self.socket_mock2.accept.call_count, 0)
    self.socket_mock2.close.assert_has_calls([mock.call()])

    # Calls for one connection that was accepted.  Three recv() calls that
    # result in two websocket Send().  The last results in no data and signals
    # closing of the connection.
    self.conn_mock.recv.assert_has_calls([mock.call(16384)]*3)
    self.assertEqual(self.conn_mock.recv.call_count, 3)
    self.conn_mock.close.assert_has_calls([mock.call()])
    self.assertTrue(self.conn_mock.close.call_count >= 1)  # pylint:disable=g-generic-assert

    tunnel_target = iap_tunnel_websocket_utils.IapTunnelTargetInfo(
        project='my-project', zone='zone-1', instance='instance-1',
        interface='nic0', port=22, url_override=None, proxy_info=None)
    partial_matcher = mock_matchers.TypeMatcher(functools.partial)
    self.websocket_cls_mock.assert_has_calls([
        mock.call(tunnel_target, partial_matcher, partial_matcher,
                  partial_matcher, ignore_certs=False)]*2)
    self.assertEqual(self.websocket_cls_mock.call_count, 2)

    # Test connection to start.
    self.assertEqual(self.websocket_mock1.InitiateConnection.call_count, 1)
    self.assertEqual(self.websocket_mock1.Send.call_count, 0)
    self.assertEqual(self.websocket_mock1.LocalEOF.call_count, 0)
    self.assertEqual(self.websocket_mock1.WaitForAllSent.call_count, 0)
    self.assertEqual(self.websocket_mock1.Close.call_count, 1)
    # Calls resulting from one connection that was accepted.
    self.assertEqual(self.websocket_mock2.InitiateConnection.call_count, 1)
    self.websocket_mock2.Send.assert_has_calls([
        mock.call(b'data1'), mock.call(b'data2')])
    self.assertEqual(self.websocket_mock2.Send.call_count, 2)
    self.assertEqual(self.websocket_mock2.LocalEOF.call_count, 1)
    self.assertEqual(self.websocket_mock2.WaitForAllSent.call_count, 1)
    self.assertEqual(self.websocket_mock2.Close.call_count, 1)