commit
693c677b87
6 changed files with 378 additions and 50 deletions
|
|
@ -45,7 +45,8 @@ def _create_image_manifest():
|
|||
{
|
||||
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
|
||||
"size": 73109,
|
||||
"digest": _create_image_digest("layer3")
|
||||
# randomize image digest
|
||||
"digest": _create_image_digest()
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -197,6 +198,47 @@ def test_put_image():
|
|||
response['image']['repositoryName'].should.equal('test_repository')
|
||||
response['image']['registryId'].should.equal('012345678910')
|
||||
|
||||
@mock_ecr
|
||||
def test_put_image_with_multiple_tags():
|
||||
client = boto3.client('ecr', region_name='us-east-1')
|
||||
_ = client.create_repository(
|
||||
repositoryName='test_repository'
|
||||
)
|
||||
manifest = _create_image_manifest()
|
||||
response = client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(manifest),
|
||||
imageTag='v1'
|
||||
)
|
||||
|
||||
response['image']['imageId']['imageTag'].should.equal('v1')
|
||||
response['image']['imageId']['imageDigest'].should.contain("sha")
|
||||
response['image']['repositoryName'].should.equal('test_repository')
|
||||
response['image']['registryId'].should.equal('012345678910')
|
||||
|
||||
response1 = client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(manifest),
|
||||
imageTag='latest'
|
||||
)
|
||||
|
||||
response1['image']['imageId']['imageTag'].should.equal('latest')
|
||||
response1['image']['imageId']['imageDigest'].should.contain("sha")
|
||||
response1['image']['repositoryName'].should.equal('test_repository')
|
||||
response1['image']['registryId'].should.equal('012345678910')
|
||||
|
||||
response2 = client.describe_images(repositoryName='test_repository')
|
||||
type(response2['imageDetails']).should.be(list)
|
||||
len(response2['imageDetails']).should.be(1)
|
||||
|
||||
response2['imageDetails'][0]['imageDigest'].should.contain("sha")
|
||||
|
||||
response2['imageDetails'][0]['registryId'].should.equal("012345678910")
|
||||
|
||||
response2['imageDetails'][0]['repositoryName'].should.equal("test_repository")
|
||||
|
||||
len(response2['imageDetails'][0]['imageTags']).should.be(2)
|
||||
response2['imageDetails'][0]['imageTags'].should.be.equal(['v1', 'latest'])
|
||||
|
||||
@mock_ecr
|
||||
def test_list_images():
|
||||
|
|
@ -281,6 +323,11 @@ def test_describe_images():
|
|||
repositoryName='test_repository'
|
||||
)
|
||||
|
||||
_ = client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(_create_image_manifest())
|
||||
)
|
||||
|
||||
_ = client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(_create_image_manifest()),
|
||||
|
|
@ -301,32 +348,37 @@ def test_describe_images():
|
|||
|
||||
response = client.describe_images(repositoryName='test_repository')
|
||||
type(response['imageDetails']).should.be(list)
|
||||
len(response['imageDetails']).should.be(3)
|
||||
len(response['imageDetails']).should.be(4)
|
||||
|
||||
response['imageDetails'][0]['imageDigest'].should.contain("sha")
|
||||
response['imageDetails'][1]['imageDigest'].should.contain("sha")
|
||||
response['imageDetails'][2]['imageDigest'].should.contain("sha")
|
||||
response['imageDetails'][3]['imageDigest'].should.contain("sha")
|
||||
|
||||
response['imageDetails'][0]['registryId'].should.equal("012345678910")
|
||||
response['imageDetails'][1]['registryId'].should.equal("012345678910")
|
||||
response['imageDetails'][2]['registryId'].should.equal("012345678910")
|
||||
response['imageDetails'][3]['registryId'].should.equal("012345678910")
|
||||
|
||||
response['imageDetails'][0]['repositoryName'].should.equal("test_repository")
|
||||
response['imageDetails'][1]['repositoryName'].should.equal("test_repository")
|
||||
response['imageDetails'][2]['repositoryName'].should.equal("test_repository")
|
||||
response['imageDetails'][3]['repositoryName'].should.equal("test_repository")
|
||||
|
||||
len(response['imageDetails'][0]['imageTags']).should.be(1)
|
||||
response['imageDetails'][0].should_not.have.key('imageTags')
|
||||
len(response['imageDetails'][1]['imageTags']).should.be(1)
|
||||
len(response['imageDetails'][2]['imageTags']).should.be(1)
|
||||
len(response['imageDetails'][3]['imageTags']).should.be(1)
|
||||
|
||||
image_tags = ['latest', 'v1', 'v2']
|
||||
set([response['imageDetails'][0]['imageTags'][0],
|
||||
response['imageDetails'][1]['imageTags'][0],
|
||||
response['imageDetails'][2]['imageTags'][0]]).should.equal(set(image_tags))
|
||||
set([response['imageDetails'][1]['imageTags'][0],
|
||||
response['imageDetails'][2]['imageTags'][0],
|
||||
response['imageDetails'][3]['imageTags'][0]]).should.equal(set(image_tags))
|
||||
|
||||
response['imageDetails'][0]['imageSizeInBytes'].should.equal(52428800)
|
||||
response['imageDetails'][1]['imageSizeInBytes'].should.equal(52428800)
|
||||
response['imageDetails'][2]['imageSizeInBytes'].should.equal(52428800)
|
||||
response['imageDetails'][3]['imageSizeInBytes'].should.equal(52428800)
|
||||
|
||||
|
||||
@mock_ecr
|
||||
|
|
@ -355,6 +407,68 @@ def test_describe_images_by_tag():
|
|||
image_detail['imageDigest'].should.equal(put_response['imageId']['imageDigest'])
|
||||
|
||||
|
||||
@mock_ecr
|
||||
def test_describe_images_tags_should_not_contain_empty_tag1():
|
||||
client = boto3.client('ecr', region_name='us-east-1')
|
||||
_ = client.create_repository(
|
||||
repositoryName='test_repository'
|
||||
)
|
||||
|
||||
manifest = _create_image_manifest()
|
||||
client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(manifest)
|
||||
)
|
||||
|
||||
tags = ['v1', 'v2', 'latest']
|
||||
for tag in tags:
|
||||
client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(manifest),
|
||||
imageTag=tag
|
||||
)
|
||||
|
||||
response = client.describe_images(repositoryName='test_repository', imageIds=[{'imageTag': tag}])
|
||||
len(response['imageDetails']).should.be(1)
|
||||
image_detail = response['imageDetails'][0]
|
||||
len(image_detail['imageTags']).should.equal(3)
|
||||
image_detail['imageTags'].should.be.equal(tags)
|
||||
|
||||
|
||||
@mock_ecr
|
||||
def test_describe_images_tags_should_not_contain_empty_tag2():
|
||||
client = boto3.client('ecr', region_name='us-east-1')
|
||||
_ = client.create_repository(
|
||||
repositoryName='test_repository'
|
||||
)
|
||||
|
||||
manifest = _create_image_manifest()
|
||||
tags = ['v1', 'v2']
|
||||
for tag in tags:
|
||||
client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(manifest),
|
||||
imageTag=tag
|
||||
)
|
||||
|
||||
client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(manifest)
|
||||
)
|
||||
|
||||
client.put_image(
|
||||
repositoryName='test_repository',
|
||||
imageManifest=json.dumps(manifest),
|
||||
imageTag='latest'
|
||||
)
|
||||
|
||||
response = client.describe_images(repositoryName='test_repository', imageIds=[{'imageTag': tag}])
|
||||
len(response['imageDetails']).should.be(1)
|
||||
image_detail = response['imageDetails'][0]
|
||||
len(image_detail['imageTags']).should.equal(3)
|
||||
image_detail['imageTags'].should.be.equal(['v1', 'v2', 'latest'])
|
||||
|
||||
|
||||
@mock_ecr
|
||||
def test_describe_repository_that_doesnt_exist():
|
||||
client = boto3.client('ecr', region_name='us-east-1')
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import boto3
|
||||
import sure # noqa
|
||||
import json
|
||||
import sure # noqa
|
||||
import boto3
|
||||
|
||||
from moto import mock_iot
|
||||
|
||||
|
||||
|
|
@ -63,6 +64,166 @@ def test_things():
|
|||
res.should.have.key('thingTypes').which.should.have.length_of(0)
|
||||
|
||||
|
||||
@mock_iot
|
||||
def test_list_thing_types():
|
||||
client = boto3.client('iot', region_name='ap-northeast-1')
|
||||
|
||||
for i in range(0, 100):
|
||||
client.create_thing_type(thingTypeName=str(i + 1))
|
||||
|
||||
thing_types = client.list_thing_types()
|
||||
thing_types.should.have.key('nextToken')
|
||||
thing_types.should.have.key('thingTypes').which.should.have.length_of(50)
|
||||
thing_types['thingTypes'][0]['thingTypeName'].should.equal('1')
|
||||
thing_types['thingTypes'][-1]['thingTypeName'].should.equal('50')
|
||||
|
||||
thing_types = client.list_thing_types(nextToken=thing_types['nextToken'])
|
||||
thing_types.should.have.key('thingTypes').which.should.have.length_of(50)
|
||||
thing_types.should_not.have.key('nextToken')
|
||||
thing_types['thingTypes'][0]['thingTypeName'].should.equal('51')
|
||||
thing_types['thingTypes'][-1]['thingTypeName'].should.equal('100')
|
||||
|
||||
|
||||
@mock_iot
|
||||
def test_list_thing_types_with_typename_filter():
|
||||
client = boto3.client('iot', region_name='ap-northeast-1')
|
||||
|
||||
client.create_thing_type(thingTypeName='thing')
|
||||
client.create_thing_type(thingTypeName='thingType')
|
||||
client.create_thing_type(thingTypeName='thingTypeName')
|
||||
client.create_thing_type(thingTypeName='thingTypeNameGroup')
|
||||
client.create_thing_type(thingTypeName='shouldNotFind')
|
||||
client.create_thing_type(thingTypeName='find me it shall not')
|
||||
|
||||
thing_types = client.list_thing_types(thingTypeName='thing')
|
||||
thing_types.should_not.have.key('nextToken')
|
||||
thing_types.should.have.key('thingTypes').which.should.have.length_of(4)
|
||||
thing_types['thingTypes'][0]['thingTypeName'].should.equal('thing')
|
||||
thing_types['thingTypes'][-1]['thingTypeName'].should.equal('thingTypeNameGroup')
|
||||
|
||||
thing_types = client.list_thing_types(thingTypeName='thingTypeName')
|
||||
thing_types.should_not.have.key('nextToken')
|
||||
thing_types.should.have.key('thingTypes').which.should.have.length_of(2)
|
||||
thing_types['thingTypes'][0]['thingTypeName'].should.equal('thingTypeName')
|
||||
thing_types['thingTypes'][-1]['thingTypeName'].should.equal('thingTypeNameGroup')
|
||||
|
||||
|
||||
@mock_iot
|
||||
def test_list_things_with_next_token():
|
||||
client = boto3.client('iot', region_name='ap-northeast-1')
|
||||
|
||||
for i in range(0, 200):
|
||||
client.create_thing(thingName=str(i + 1))
|
||||
|
||||
things = client.list_things()
|
||||
things.should.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(50)
|
||||
things['things'][0]['thingName'].should.equal('1')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/1')
|
||||
things['things'][-1]['thingName'].should.equal('50')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/50')
|
||||
|
||||
things = client.list_things(nextToken=things['nextToken'])
|
||||
things.should.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(50)
|
||||
things['things'][0]['thingName'].should.equal('51')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/51')
|
||||
things['things'][-1]['thingName'].should.equal('100')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/100')
|
||||
|
||||
things = client.list_things(nextToken=things['nextToken'])
|
||||
things.should.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(50)
|
||||
things['things'][0]['thingName'].should.equal('101')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/101')
|
||||
things['things'][-1]['thingName'].should.equal('150')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/150')
|
||||
|
||||
things = client.list_things(nextToken=things['nextToken'])
|
||||
things.should_not.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(50)
|
||||
things['things'][0]['thingName'].should.equal('151')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/151')
|
||||
things['things'][-1]['thingName'].should.equal('200')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/200')
|
||||
|
||||
|
||||
@mock_iot
|
||||
def test_list_things_with_attribute_and_thing_type_filter_and_next_token():
|
||||
client = boto3.client('iot', region_name='ap-northeast-1')
|
||||
client.create_thing_type(thingTypeName='my-thing-type')
|
||||
|
||||
for i in range(0, 200):
|
||||
if not (i + 1) % 3:
|
||||
attribute_payload = {
|
||||
'attributes': {
|
||||
'foo': 'bar'
|
||||
}
|
||||
}
|
||||
elif not (i + 1) % 5:
|
||||
attribute_payload = {
|
||||
'attributes': {
|
||||
'bar': 'foo'
|
||||
}
|
||||
}
|
||||
else:
|
||||
attribute_payload = {}
|
||||
|
||||
if not (i + 1) % 2:
|
||||
thing_type_name = 'my-thing-type'
|
||||
client.create_thing(thingName=str(i + 1), thingTypeName=thing_type_name, attributePayload=attribute_payload)
|
||||
else:
|
||||
client.create_thing(thingName=str(i + 1), attributePayload=attribute_payload)
|
||||
|
||||
# Test filter for thingTypeName
|
||||
things = client.list_things(thingTypeName=thing_type_name)
|
||||
things.should.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(50)
|
||||
things['things'][0]['thingName'].should.equal('2')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/2')
|
||||
things['things'][-1]['thingName'].should.equal('100')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/100')
|
||||
all(item['thingTypeName'] == thing_type_name for item in things['things'])
|
||||
|
||||
things = client.list_things(nextToken=things['nextToken'], thingTypeName=thing_type_name)
|
||||
things.should_not.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(50)
|
||||
things['things'][0]['thingName'].should.equal('102')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/102')
|
||||
things['things'][-1]['thingName'].should.equal('200')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/200')
|
||||
all(item['thingTypeName'] == thing_type_name for item in things['things'])
|
||||
|
||||
# Test filter for attributes
|
||||
things = client.list_things(attributeName='foo', attributeValue='bar')
|
||||
things.should.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(50)
|
||||
things['things'][0]['thingName'].should.equal('3')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/3')
|
||||
things['things'][-1]['thingName'].should.equal('150')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/150')
|
||||
all(item['attributes'] == {'foo': 'bar'} for item in things['things'])
|
||||
|
||||
things = client.list_things(nextToken=things['nextToken'], attributeName='foo', attributeValue='bar')
|
||||
things.should_not.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(16)
|
||||
things['things'][0]['thingName'].should.equal('153')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/153')
|
||||
things['things'][-1]['thingName'].should.equal('198')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/198')
|
||||
all(item['attributes'] == {'foo': 'bar'} for item in things['things'])
|
||||
|
||||
# Test filter for attributes and thingTypeName
|
||||
things = client.list_things(thingTypeName=thing_type_name, attributeName='foo', attributeValue='bar')
|
||||
things.should_not.have.key('nextToken')
|
||||
things.should.have.key('things').which.should.have.length_of(33)
|
||||
things['things'][0]['thingName'].should.equal('6')
|
||||
things['things'][0]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/6')
|
||||
things['things'][-1]['thingName'].should.equal('198')
|
||||
things['things'][-1]['thingArn'].should.equal('arn:aws:iot:ap-northeast-1:1:thing/198')
|
||||
all(item['attributes'] == {'foo': 'bar'} and item['thingTypeName'] == thing_type_name for item in things['things'])
|
||||
|
||||
|
||||
@mock_iot
|
||||
def test_certs():
|
||||
client = boto3.client('iot', region_name='ap-northeast-1')
|
||||
|
|
@ -204,7 +365,6 @@ def test_principal_thing():
|
|||
@mock_iot
|
||||
def test_thing_groups():
|
||||
client = boto3.client('iot', region_name='ap-northeast-1')
|
||||
name = 'my-thing'
|
||||
group_name = 'my-group-name'
|
||||
|
||||
# thing group
|
||||
|
|
@ -424,6 +584,7 @@ def test_create_job():
|
|||
job.should.have.key('jobArn')
|
||||
job.should.have.key('description')
|
||||
|
||||
|
||||
@mock_iot
|
||||
def test_describe_job():
|
||||
client = boto3.client('iot', region_name='eu-west-1')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue