2016-10-31 32 views
1

我试图用FakeS3来模拟我的S3端点来测试我的流水线在流浪机里面的流水线Luigi。对于boto能够与FakeS3交互的连接必须建立与OrdinaryCallingFormat为:如何用FakeS3测试Luigi?

from boto.s3.connection import S3Connection, OrdinaryCallingFormat 
conn = S3Connection('XXX', 'XXX', is_secure=False, 
        port=4567, host='localhost', 
        calling_format=OrdinaryCallingFormat()) 

但使用时路易吉此连接被掩埋在s3 module。我能够通过修改我的luigi.cfg并添加S3部分作为

[s3] 
host=127.0.0.1 
port=4567 
aws_access_key_id=XXX 
aws_secret_access_key=XXXXXX 
is_secure=0 

通过大部分的选择,但我不知道如何来传递所需的对象为calling_format

现在我卡住了,不知道如何继续。选择我能想到的:

  1. 图如何通过luigi.cfg
  2. 图如何强制boto始终使用此电话格式在我流浪的机器,通过设置一个未知的选项,我通过OrdinaryCallingFormatS3Connection无论是在.aws/configboto.cfg
  3. 制作FakeS3接受由boto出现这种情况使用的默认calling_formatSubdomainCallingFormat(不管它意味着)。

有关如何解决这个问题的任何想法?

回答

1

你能不能把它作为krongs传递给构造函数的S3Client?

client = S3Client(aws_access_key, aws_secret_key, 
        {'calling_format':OrdinaryCallingFormat()}) 
target = S3Target('s3://somebucket/test', client=client) 
+0

我可以但是这行代码是luigi而不是我的代码。修补luigi是解决方法,但会打破任何新版本的Luigi – tonicebrian

+0

您没有在您的代码中实例化'S3Target'?您应该能够将上面的'S3Client'作为客户端参数传递给'S3Target'构造函数。 – MattMcKnight

+0

我正在实例化S3Target,但之后我无法找到Luigi管道为FakeS3注入S3Client以及默认S3Client进行生产的优雅方式。有关如何执行此依赖注入而不污染管道的所有代码的任何想法? – tonicebrian

0

我在使用boto3连接到fakeS3时没有遇到任何问题。

import boto3 
s3 = boto3.client(
    "s3", region_name="fakes3", 
    use_ssl=False, 
    aws_access_key_id="", 
    aws_secret_access_key="", 
    endpoint_url="http://localhost:4567" 
) 

不需要专门的调用方法。

也许我错了,你真的需要OrdinaryCallingFormat,如果我的代码不能正常工作,请进行GitHub的话题boto3支持上: https://github.com/boto/boto3/issues/334

+0

问题是组合Luigi + FakeS3 – tonicebrian

0

你可以用calling_format参数设置。这里是假-S3的配置示例:

[s3] 
aws_access_key_id=123 
aws_secret_access_key=abc 
host=fake-s3 
port=4569 
is_secure=0 
calling_format=boto.s3.connection.OrdinaryCallingFormat