Example #1
0
    def SetUp(self):
        # No need to specify that we are using the GA api, and the GA command group
        # which is not the case for scp.
        self.instance = self.messages.Instance(
            id=11111,
            name='instance-1',
            networkInterfaces=[
                self.messages.NetworkInterface(accessConfigs=[
                    self.messages.AccessConfig(natIP='23.251.133.1'),
                ], ),
            ],
            status=self.messages.Instance.StatusValueValuesEnum.RUNNING,
            selfLink=(self.compute_uri + '/projects/my-project/'
                      'zones/zone-1/instances/instance-1'),
            zone=(self.compute_uri + '/projects/my-project/zones/zone-1'))

        self.instance_without_external_ip_address = self.messages.Instance(
            id=22222,
            name='instance-2',
            networkInterfaces=[
                self.messages.NetworkInterface(),
            ],
            status=self.messages.Instance.StatusValueValuesEnum.RUNNING,
            selfLink=(self.compute_uri + '/projects/my-project/'
                      'zones/zone-1/instances/instance-4'),
            zone=(self.compute_uri + '/projects/my-project/zones/zone-1'))

        self.remote = ssh.Remote.FromArg('[email protected]')
        self.remote_file = ssh.FileReference('~/remote-file',
                                             remote=self.remote)
        self.local_dir = ssh.FileReference('~/local-dir')
Example #2
0
 def SetUp(self):
     self.remote_instance = ssh.Remote('i2')
     self.remote_file_1 = ssh.FileReference('rem_1', remote=self.remote)
     self.remote_file_2 = ssh.FileReference('rem_2', remote=self.remote)
     self.other_remote_file = ssh.FileReference('rem_3',
                                                remote=ssh.Remote('i5'))
     self.local_file_1 = ssh.FileReference('local_1')
     self.local_file_2 = ssh.FileReference('local_2')
Example #3
0
    def testSimpleCase(self, test_instance_key, explicit_flag):
        test_instance = self.instances[test_instance_key]
        self.make_requests.side_effect = iter([
            [test_instance],
            [self.project_resource],
        ])

        self.Run(
            'compute scp {}:~/remote-file ~/local-dir --zone zone-1{}'.format(
                test_instance.name,
                ' --tunnel-through-iap' if explicit_flag else ''))

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

        # Require SSH keys
        self.ensure_keys.assert_called_once_with(self.keys,
                                                 None,
                                                 allow_passphrase=True)

        # No polling
        self.poller_poll.assert_not_called()

        expected_tunnel_args = iap_tunnel.SshTunnelArgs()
        expected_tunnel_args.track = self.track.prefix
        expected_tunnel_args.project = 'my-project'
        expected_tunnel_args.zone = 'zone-1'
        expected_tunnel_args.instance = test_instance.name

        # SCP Command
        remote_file = ssh.FileReference(
            '~/remote-file',
            remote=ssh.Remote.FromArg('me@compute.%s' % test_instance.id))
        local_dir = ssh.FileReference('~/local-dir')
        self.scp_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SCPCommand), [remote_file],
            local_dir,
            identity_file=self.private_key_file,
            extra_flags=[],
            port=None,
            recursive=False,
            compress=False,
            options=dict(self.options,
                         HostKeyAlias='compute.%s' % test_instance.id),
            iap_tunnel_args=expected_tunnel_args)

        self.scp_run.assert_called_once_with(mock_matchers.TypeMatcher(
            ssh.SCPCommand),
                                             self.env,
                                             force_connect=True)
Example #4
0
    def SetUp(self):
        self.remote = ssh.Remote.FromArg('[email protected]')
        self.remote_file = ssh.FileReference('~/remote-file',
                                             remote=self.remote)
        self.local_dir = ssh.FileReference('~/local-dir')

        datetime_patcher = mock.patch('datetime.datetime',
                                      test_base.FakeDateTimeWithTimeZone)
        self.addCleanup(datetime_patcher.stop)
        datetime_patcher.start()
Example #5
0
    def testOverrideUsername(self, oslogin_mock):
        properties.VALUES.core.account.Set('*****@*****.**')
        self.remote = ssh.Remote.FromArg('[email protected]')
        self.remote_file = ssh.FileReference('~/remote-file',
                                             remote=self.remote)
        self.local_dir = ssh.FileReference('~/local-dir')
        oslogin_mock.return_value = test_resources.MakeOsloginClient('v1beta')

        self.make_requests.side_effect = iter([
            [self.instance_with_oslogin_enabled],
            [self.project_resource],
        ])

        self.Run("""\
        compute scp
          someotheruser@instance-1:~/remote-file
          ~/local-dir --zone zone-1
        """)

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

        # Require SSH keys
        self.ensure_keys.assert_called_once_with(self.keys,
                                                 None,
                                                 allow_passphrase=True)

        # No polling
        self.poller_poll.assert_not_called()

        # SCP Command
        self.scp_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SCPCommand), [self.remote_file],
            self.local_dir,
            identity_file=self.private_key_file,
            extra_flags=[],
            port=None,
            recursive=False,
            compress=False,
            options=dict(self.options, HostKeyAlias='compute.44444'),
            iap_tunnel_args=None)

        self.scp_run.assert_called_once_with(mock_matchers.TypeMatcher(
            ssh.SCPCommand),
                                             self.env,
                                             force_connect=True)

        self.AssertErrContains('Using OS Login user [user_google_com] instead '
                               'of requested user [someotheruser]')
Example #6
0
    def testWithInternalIPAddress(self, track, api_version):
        self._SetUpForTrack(track, api_version)
        self.make_requests.side_effect = iter([
            [self.instance_with_internal_ip_address],
            [self.project_resource],
        ])

        self.Run("""
      compute scp
      ~/local-file-1 instance-3:~/remote-dir
      --zone zone-1 --internal-ip
      """)
        self.CheckRequests(
            [(self.compute.instances, 'Get',
              self.messages.ComputeInstancesGetRequest(instance='instance-3',
                                                       project='my-project',
                                                       zone='zone-1'))],
            [(self.compute.projects, 'Get',
              self.messages.ComputeProjectsGetRequest(project='my-project'))],
        )
        self.remote = ssh.Remote.FromArg('[email protected]')
        self.remote_dir = ssh.FileReference('~/remote-dir', self.remote)
        self.local_file = ssh.FileReference('~/local-file-1')

        self.scp_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SCPCommand), [self.local_file],
            self.remote_dir,
            identity_file=self.private_key_file,
            extra_flags=[],
            port=None,
            recursive=False,
            compress=False,
            options=dict(self.options, HostKeyAlias='compute.33333'),
            iap_tunnel_args=None)

        self.ssh_init.assert_has_calls([
            mock.call(
                mock_matchers.TypeMatcher(ssh.SSHCommand),
                remote=self.remote,
                identity_file=self.private_key_file,
                options=dict(self.options, HostKeyAlias='compute.33333'),
                remote_command=[
                    '[ `curl "http://metadata.google.internal/'
                    'computeMetadata/v1/instance/id" -H "Metadata-Flavor: '
                    'Google" -q` = 33333 ] || exit 23'
                ]),
        ],
                                       any_order=True)
Example #7
0
    def testWithAlternateUser(self):
        project_resource = self.messages.Project(name='my-project', )
        self.make_requests.side_effect = iter([
            [self.instance],
            [project_resource],
            [],
        ])

        self.Run("""\
        compute scp
          hapoo@instance-1:~/remote-file
          ~/local-dir --zone zone-1
        """)

        self.CheckRequests(
            [(self.compute.instances, 'Get',
              self.messages.ComputeInstancesGetRequest(instance='instance-1',
                                                       project='my-project',
                                                       zone='zone-1'))],
            [(self.compute.projects, 'Get',
              self.messages.ComputeProjectsGetRequest(project='my-project'))],
            [(self.compute.projects, 'SetCommonInstanceMetadata',
              self.messages.ComputeProjectsSetCommonInstanceMetadataRequest(
                  metadata=self.messages.Metadata(items=[
                      self.messages.Metadata.ItemsValueListEntry(
                          key='ssh-keys',
                          value='hapoo:' + self.public_key_material),
                  ]),
                  project='my-project'))],
        )

        remote = ssh.Remote(self.remote.host, user='******')
        remote_file = ssh.FileReference('~/remote-file', remote=remote)
        # Polling
        self.poller_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SSHPoller),
            remote=remote,
            identity_file=self.private_key_file,
            max_wait_ms=ssh_utils.SSH_KEY_PROPAGATION_TIMEOUT_MS,
            options=dict(self.options, HostKeyAlias='compute.11111'),
            extra_flags=None,
            iap_tunnel_args=None)
        self.poller_poll.assert_called_once()

        # SCP Command
        self.scp_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SCPCommand), [remote_file],
            self.local_dir,
            identity_file=self.private_key_file,
            extra_flags=[],
            port=None,
            recursive=False,
            compress=False,
            options=dict(self.options, HostKeyAlias='compute.11111'),
            iap_tunnel_args=None)

        self.scp_run.assert_called_once_with(mock_matchers.TypeMatcher(
            ssh.SCPCommand),
                                             self.env,
                                             force_connect=True)
Example #8
0
    def testWithManyRemoteFilesToLocalDestination(self):
        self.make_requests.side_effect = iter([
            [self.instance],
            [self.project_resource],
        ])

        self.Run(r"""
        compute scp
          instance-1:~/remote-file-1
          instance-1:~/remote-file-2
          instance-1:~/remote-file-3
          ~/local-dir
          --zone zone-1
        """)

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

        remote = ssh.Remote('23.251.133.1', user='******')

        # SCP Command
        self.scp_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SCPCommand), [
                ssh.FileReference('~/remote-file-1', remote=remote),
                ssh.FileReference('~/remote-file-2', remote=remote),
                ssh.FileReference('~/remote-file-3', remote=remote),
            ],
            self.local_dir,
            identity_file=self.private_key_file,
            extra_flags=[],
            port=None,
            recursive=False,
            compress=False,
            options=dict(self.options, HostKeyAlias='compute.11111'),
            iap_tunnel_args=None)

        self.scp_run.assert_called_once_with(mock_matchers.TypeMatcher(
            ssh.SCPCommand),
                                             self.env,
                                             force_connect=True)
Example #9
0
    def testWithManyLocalFilesToRemoteDestination(self):
        self.make_requests.side_effect = iter([
            [self.instance],
            [self.project_resource],
        ])

        self.Run("""\
        compute scp
          ~/local-file-1
          ~/local-file-2
          ~/local-file-3
          instance-1:~/remote-dir
          --zone zone-1
        """)

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

        remote_dir = ssh.FileReference('~/remote-dir', remote=self.remote)

        # SCP Command
        self.scp_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SCPCommand), [
                ssh.FileReference('~/local-file-1'),
                ssh.FileReference('~/local-file-2'),
                ssh.FileReference('~/local-file-3'),
            ],
            remote_dir,
            identity_file=self.private_key_file,
            extra_flags=[],
            port=None,
            recursive=False,
            compress=False,
            options=dict(self.options, HostKeyAlias='compute.11111'),
            iap_tunnel_args=None)
Example #10
0
    def testWithAlternateUser(self, test_instance_key):
        project_resource = self.messages.Project(name='my-project', )
        test_instance = self.instances[test_instance_key]
        self.make_requests.side_effect = iter([
            [test_instance],
            [project_resource],
            [],
        ])

        self.Run('compute scp hapoo@{}:~/remote-file ~/local-dir '
                 '--zone zone-1 --tunnel-through-iap'.format(
                     test_instance.name))
        self.CheckRequests(
            [(self.compute.instances, 'Get',
              self.messages.ComputeInstancesGetRequest(
                  instance=test_instance.name,
                  project='my-project',
                  zone='zone-1'))],
            [(self.compute.projects, 'Get',
              self.messages.ComputeProjectsGetRequest(project='my-project'))],
            [(self.compute.projects, 'SetCommonInstanceMetadata',
              self.messages.ComputeProjectsSetCommonInstanceMetadataRequest(
                  metadata=self.messages.Metadata(items=[
                      self.messages.Metadata.ItemsValueListEntry(
                          key='ssh-keys',
                          value='hapoo:' + self.public_key_material),
                  ]),
                  project='my-project'))],
        )

        expected_tunnel_args = iap_tunnel.SshTunnelArgs()
        expected_tunnel_args.track = self.track.prefix
        expected_tunnel_args.project = 'my-project'
        expected_tunnel_args.zone = 'zone-1'
        expected_tunnel_args.instance = test_instance.name

        # Polling
        remote = ssh.Remote.FromArg('hapoo@compute.%s' % test_instance.id)
        self.poller_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SSHPoller),
            remote=remote,
            identity_file=self.private_key_file,
            max_wait_ms=ssh_utils.SSH_KEY_PROPAGATION_TIMEOUT_MS,
            options=dict(self.options,
                         HostKeyAlias='compute.%s' % test_instance.id),
            extra_flags=None,
            iap_tunnel_args=expected_tunnel_args)
        self.poller_poll.assert_called_once()

        # SCP Command
        remote_file = ssh.FileReference('~/remote-file', remote=remote)
        self.scp_init.assert_called_once_with(
            mock_matchers.TypeMatcher(ssh.SCPCommand), [remote_file],
            ssh.FileReference('~/local-dir'),
            identity_file=self.private_key_file,
            extra_flags=[],
            port=None,
            recursive=False,
            compress=False,
            options=dict(self.options,
                         HostKeyAlias='compute.%s' % test_instance.id),
            iap_tunnel_args=expected_tunnel_args)

        self.scp_run.assert_called_once_with(mock_matchers.TypeMatcher(
            ssh.SCPCommand),
                                             self.env,
                                             force_connect=True)