Add stdin_open tty flags to container
Change-Id: I6a679cc02a407bb866f2d740d127f22de60b6ae1 Partially-Implements: BP support-interactive-mode
This commit is contained in:
parent
b0bd22e8a2
commit
005a03d010
@ -133,7 +133,7 @@ Using the service
|
|||||||
|
|
||||||
We will create a container that pings the address 8.8.8.8 four times::
|
We will create a container that pings the address 8.8.8.8 four times::
|
||||||
|
|
||||||
zun create --name test --image cirros --command "ping -c 4 8.8.8.8"
|
zun create --name test --command "ping -c 4 8.8.8.8" cirros
|
||||||
zun start test
|
zun start test
|
||||||
|
|
||||||
You should see a similar output to::
|
You should see a similar output to::
|
||||||
|
@ -55,7 +55,7 @@ Proposed change
|
|||||||
it in the follow bp/bug).
|
it in the follow bp/bug).
|
||||||
|
|
||||||
The diagram below offers an overview of the interactive mode architecture.
|
The diagram below offers an overview of the interactive mode architecture.
|
||||||
E.g : zun run -it --name test --image cirros --command "/bin/sh"
|
E.g : zun run -i -t --name test --command "/bin/sh" cirros
|
||||||
|
|
||||||
The sequence diagram is in this link:
|
The sequence diagram is in this link:
|
||||||
https://github.com/kevin-zhaoshuai/workflow
|
https://github.com/kevin-zhaoshuai/workflow
|
||||||
|
@ -192,6 +192,15 @@ class ContainersController(rest.RestController):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
msg = _('Valid run values are true, false, 0, 1, yes and no')
|
msg = _('Valid run values are true, false, 0, 1, yes and no')
|
||||||
raise exception.InvalidValue(msg)
|
raise exception.InvalidValue(msg)
|
||||||
|
try:
|
||||||
|
container_dict['tty'] = strutils.bool_from_string(
|
||||||
|
container_dict.get('tty', False), strict=True)
|
||||||
|
container_dict['stdin_open'] = strutils.bool_from_string(
|
||||||
|
container_dict.get('stdin_open', False), strict=True)
|
||||||
|
except ValueError:
|
||||||
|
msg = _('Valid tty and stdin_open values are ''true'', '
|
||||||
|
'"false", True, False, "True" and "False"')
|
||||||
|
raise exception.InvalidValue(msg)
|
||||||
|
|
||||||
# NOTE(mkrai): Intent here is to check the existence of image
|
# NOTE(mkrai): Intent here is to check the existence of image
|
||||||
# before proceeding to create container. If image is not found,
|
# before proceeding to create container. If image is not found,
|
||||||
|
@ -25,6 +25,8 @@ _container_properties = {
|
|||||||
'labels': parameter_types.labels,
|
'labels': parameter_types.labels,
|
||||||
'environment': parameter_types.environment,
|
'environment': parameter_types.environment,
|
||||||
'restart_policy': parameter_types.restart_policy,
|
'restart_policy': parameter_types.restart_policy,
|
||||||
|
'tty': parameter_types.boolean,
|
||||||
|
'stdin_open': parameter_types.boolean,
|
||||||
}
|
}
|
||||||
|
|
||||||
container_create = {
|
container_create = {
|
||||||
@ -45,7 +47,7 @@ query_param_rename = {
|
|||||||
query_param_create = {
|
query_param_create = {
|
||||||
'type': 'object',
|
'type': 'object',
|
||||||
'properties': {
|
'properties': {
|
||||||
'run': parameter_types.boolean
|
'run': parameter_types.boolean_extended
|
||||||
},
|
},
|
||||||
'additionalProperties': False
|
'additionalProperties': False
|
||||||
}
|
}
|
||||||
@ -64,7 +66,7 @@ container_update = {
|
|||||||
query_param_delete = {
|
query_param_delete = {
|
||||||
'type': 'object',
|
'type': 'object',
|
||||||
'properties': {
|
'properties': {
|
||||||
'force': parameter_types.boolean
|
'force': parameter_types.boolean_extended
|
||||||
},
|
},
|
||||||
'additionalProperties': False
|
'additionalProperties': False
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,9 @@ _basic_keys = (
|
|||||||
'image_pull_policy',
|
'image_pull_policy',
|
||||||
'host',
|
'host',
|
||||||
'restart_policy',
|
'restart_policy',
|
||||||
'status_detail'
|
'status_detail',
|
||||||
|
'tty',
|
||||||
|
'stdin_open'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ non_negative_integer = {
|
|||||||
'pattern': '^[0-9]*$', 'minimum': 0
|
'pattern': '^[0-9]*$', 'minimum': 0
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean = {
|
boolean_extended = {
|
||||||
'type': ['boolean', 'string'],
|
'type': ['boolean', 'string'],
|
||||||
'enum': [True, 'True', 'TRUE', 'true', '1', 'ON', 'On', 'on',
|
'enum': [True, 'True', 'TRUE', 'true', '1', 'ON', 'On', 'on',
|
||||||
'YES', 'Yes', 'yes',
|
'YES', 'Yes', 'yes',
|
||||||
@ -26,6 +26,11 @@ boolean = {
|
|||||||
'NO', 'No', 'no'],
|
'NO', 'No', 'no'],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean = {
|
||||||
|
'type': ['boolean', 'string'],
|
||||||
|
'enum': [True, 'True', 'true', False, 'False', 'false'],
|
||||||
|
}
|
||||||
|
|
||||||
container_name = {
|
container_name = {
|
||||||
'type': ['string', 'null'],
|
'type': ['string', 'null'],
|
||||||
'minLength': 2,
|
'minLength': 2,
|
||||||
|
@ -74,6 +74,8 @@ class DockerDriver(driver.ContainerDriver):
|
|||||||
'environment': container.environment,
|
'environment': container.environment,
|
||||||
'working_dir': container.workdir,
|
'working_dir': container.workdir,
|
||||||
'labels': container.labels,
|
'labels': container.labels,
|
||||||
|
'tty': container.tty,
|
||||||
|
'stdin_open': container.stdin_open,
|
||||||
}
|
}
|
||||||
|
|
||||||
host_config = {}
|
host_config = {}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
"""add tty stdin_open
|
||||||
|
|
||||||
|
Revision ID: d1ef05fd92c8
|
||||||
|
Revises: ad43a2179cf2
|
||||||
|
Create Date: 2016-11-09 09:40:59.839380
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'd1ef05fd92c8'
|
||||||
|
down_revision = 'ad43a2179cf2'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.add_column('container',
|
||||||
|
sa.Column('tty', sa.Boolean,
|
||||||
|
nullable=True))
|
||||||
|
op.add_column('container',
|
||||||
|
sa.Column('stdin_open', sa.Boolean,
|
||||||
|
nullable=True))
|
@ -148,6 +148,8 @@ class Container(Base):
|
|||||||
host = Column(String(255))
|
host = Column(String(255))
|
||||||
restart_policy = Column(JSONEncodedDict)
|
restart_policy = Column(JSONEncodedDict)
|
||||||
status_detail = Column(String(50))
|
status_detail = Column(String(50))
|
||||||
|
tty = Column(Boolean, default=False)
|
||||||
|
stdin_open = Column(Boolean, default=False)
|
||||||
|
|
||||||
|
|
||||||
class Image(Base):
|
class Image(Base):
|
||||||
|
@ -29,7 +29,8 @@ class Container(base.ZunPersistentObject, base.ZunObject):
|
|||||||
# Version 1.7: Add host column
|
# Version 1.7: Add host column
|
||||||
# Version 1.8: Add restart_policy
|
# Version 1.8: Add restart_policy
|
||||||
# Version 1.9: Add status_detail column
|
# Version 1.9: Add status_detail column
|
||||||
VERSION = '1.9'
|
# Version 1.10: Add tty, stdin_open
|
||||||
|
VERSION = '1.10'
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': fields.IntegerField(),
|
'id': fields.IntegerField(),
|
||||||
@ -55,7 +56,9 @@ class Container(base.ZunPersistentObject, base.ZunObject):
|
|||||||
'image_pull_policy': fields.StringField(nullable=True),
|
'image_pull_policy': fields.StringField(nullable=True),
|
||||||
'host': fields.StringField(nullable=True),
|
'host': fields.StringField(nullable=True),
|
||||||
'restart_policy': fields.DictOfStringsField(nullable=True),
|
'restart_policy': fields.DictOfStringsField(nullable=True),
|
||||||
'status_detail': fields.StringField(nullable=True)
|
'status_detail': fields.StringField(nullable=True),
|
||||||
|
'tty': fields.BooleanField(nullable=True),
|
||||||
|
'stdin_open': fields.BooleanField(nullable=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -85,6 +85,8 @@ class TestDockerDriver(base.DriverTestCase):
|
|||||||
'working_dir': '/home/ubuntu',
|
'working_dir': '/home/ubuntu',
|
||||||
'labels': {'key1': 'val1', 'key2': 'val2'},
|
'labels': {'key1': 'val1', 'key2': 'val2'},
|
||||||
'host_config': {'Id1': 'val1', 'key2': 'val2'},
|
'host_config': {'Id1': 'val1', 'key2': 'val2'},
|
||||||
|
'stdin_open': True,
|
||||||
|
'tty': True,
|
||||||
}
|
}
|
||||||
self.mock_docker.create_container.assert_called_once_with(
|
self.mock_docker.create_container.assert_called_once_with(
|
||||||
mock_container.image, **kwargs)
|
mock_container.image, **kwargs)
|
||||||
@ -127,6 +129,8 @@ class TestDockerDriver(base.DriverTestCase):
|
|||||||
'labels': {'key1': 'val1', 'key2': 'val2'},
|
'labels': {'key1': 'val1', 'key2': 'val2'},
|
||||||
'host_config': {'Id1': 'val1', 'key2': 'val2'},
|
'host_config': {'Id1': 'val1', 'key2': 'val2'},
|
||||||
'name': 'zun-ea8e2a25-2901-438d-8157-de7ffd68d051',
|
'name': 'zun-ea8e2a25-2901-438d-8157-de7ffd68d051',
|
||||||
|
'stdin_open': True,
|
||||||
|
'tty': True,
|
||||||
}
|
}
|
||||||
self.mock_docker.create_container.assert_called_once_with(
|
self.mock_docker.create_container.assert_called_once_with(
|
||||||
mock_container.image, **kwargs)
|
mock_container.image, **kwargs)
|
||||||
|
@ -60,6 +60,8 @@ def get_test_container(**kw):
|
|||||||
'restart_policy': kw.get('restart_policy',
|
'restart_policy': kw.get('restart_policy',
|
||||||
{'Name': 'no', 'MaximumRetryCount': '0'}),
|
{'Name': 'no', 'MaximumRetryCount': '0'}),
|
||||||
'status_detail': kw.get('status_detail', 'up from 5 hours'),
|
'status_detail': kw.get('status_detail', 'up from 5 hours'),
|
||||||
|
'tty': kw.get('tty', True),
|
||||||
|
'stdin_open': kw.get('stdin_open', True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user