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')
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')
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)
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()
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]')
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)
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)
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)
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)
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)