From fd9387a909298b5ae15a0a170997650ae778e806 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Mon, 26 Oct 2015 15:33:34 -0700 Subject: [PATCH] Switching containers does not result in state being lost Signed-off-by: Jeffrey Morgan --- src/actions/ContainerServerActions.js | 4 ++- .../ContainerDetailsHeader.react.js | 10 ++++--- .../ContainerDetailsSubheader.react.js | 16 ++++++------ src/stores/ContainerStore.js | 26 ++++++++++++++----- src/utils/DockerUtil.js | 10 ++++--- 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/actions/ContainerServerActions.js b/src/actions/ContainerServerActions.js index bbbf9c82ff..7308349f11 100644 --- a/src/actions/ContainerServerActions.js +++ b/src/actions/ContainerServerActions.js @@ -13,7 +13,9 @@ class ContainerServerActions { 'started', 'unmuted', 'updated', - 'waiting' + 'waiting', + 'kill', + 'stopped' ); } } diff --git a/src/components/ContainerDetailsHeader.react.js b/src/components/ContainerDetailsHeader.react.js index 70e90e3ef8..e6d1f17b95 100644 --- a/src/components/ContainerDetailsHeader.react.js +++ b/src/components/ContainerDetailsHeader.react.js @@ -9,12 +9,14 @@ var ContainerDetailsHeader = React.createClass({ if (this.props.container.State.Updating) { state = UPDATING; - } else if (this.props.container.State.Running && !this.props.container.State.Paused && !this.props.container.State.ExitCode && !this.props.container.State.Restarting) { - state = RUNNING; - } else if (this.props.container.State.Restarting) { - state = RESTARTING; + } else if (this.props.container.State.Stopping) { + state = STOPPING; } else if (this.props.container.State.Paused) { state = PAUSED; + } else if (this.props.container.State.Restarting) { + state = RESTARTING; + } else if (this.props.container.State.Running && !this.props.container.State.ExitCode) { + state = RUNNING; } else if (this.props.container.State.Starting) { state = STARTING; } else if (this.props.container.State.Downloading) { diff --git a/src/components/ContainerDetailsSubheader.react.js b/src/components/ContainerDetailsSubheader.react.js index fd18ab2c25..2a62dc8281 100644 --- a/src/components/ContainerDetailsSubheader.react.js +++ b/src/components/ContainerDetailsSubheader.react.js @@ -13,33 +13,33 @@ var ContainerDetailsSubheader = React.createClass({ }, disableRun: function () { if (!this.props.container) { - return false; + return true; } return (!this.props.container.State.Running || !this.props.defaultPort || this.props.container.State.Updating); }, disableRestart: function () { if (!this.props.container) { - return false; + return true; } - return (this.props.container.State.Downloading || this.props.container.State.Restarting || this.props.container.State.Updating); + return (this.props.container.State.Stopping || this.props.container.State.Downloading || this.props.container.State.Restarting || this.props.container.State.Updating); }, disableStop: function () { if (!this.props.container) { - return false; + return true; } - return (this.props.container.State.Downloading || this.props.container.State.ExitCode || !this.props.container.State.Running || this.props.container.State.Updating); + return (this.props.container.State.Stopping || this.props.container.State.Downloading || this.props.container.State.ExitCode || !this.props.container.State.Running || this.props.container.State.Updating); }, disableStart: function () { if (!this.props.container) { - return false; + return true; } return (this.props.container.State.Downloading || this.props.container.State.Running || this.props.container.State.Updating); }, disableTerminal: function () { if (!this.props.container) { - return false; + return true; } - return (!this.props.container.State.Running || this.props.container.State.Updating); + return (this.props.container.State.Stopping || !this.props.container.State.Running || this.props.container.State.Updating); }, disableTab: function () { if (!this.props.container) { diff --git a/src/stores/ContainerStore.js b/src/stores/ContainerStore.js index 718feb7038..28a6e306dd 100644 --- a/src/stores/ContainerStore.js +++ b/src/stores/ContainerStore.js @@ -38,10 +38,22 @@ class ContainerStore { } } - stop ({name}) { + stopped ({id}) { let containers = this.containers; - if (containers[name]) { - containers[name].State.Running = false; + let container = _.find(_.values(containers), c => c.Id === id || c.Name === id); + + if (containers[container.Name]) { + containers[container.Name].State.Stopping = false; + this.setState({containers}); + } + } + + kill ({id}) { + let containers = this.containers; + let container = _.find(_.values(containers), c => c.Id === id || c.Name === id); + + if (containers[container.Name]) { + containers[container.Name].State.Stopping = true; this.setState({containers}); } } @@ -72,6 +84,10 @@ class ContainerStore { return; } + if (containers[name].State.Stopping) { + return; + } + _.extend(containers[name], container); if (containers[name].State) { @@ -113,9 +129,7 @@ class ContainerStore { destroyed ({id}) { let containers = this.containers; - let container = _.find(_.values(this.containers), container => { - return container.Id === id || container.Name === id; - }); + let container = _.find(_.values(containers), c => c.Id === id || c.Name === id); if (container && container.State && container.State.Updating) { return; diff --git a/src/utils/DockerUtil.js b/src/utils/DockerUtil.js index 3d56210d33..df4344976a 100644 --- a/src/utils/DockerUtil.js +++ b/src/utils/DockerUtil.js @@ -269,7 +269,7 @@ export default { }, restart (name) { - this.client.getContainer(name).stop(stopError => { + this.client.getContainer(name).stop({t: 5}, stopError => { if (stopError && stopError.statusCode !== 304) { containerServerActions.error({name, stopError}); return; @@ -285,7 +285,7 @@ export default { }, stop (name) { - this.client.getContainer(name).stop(error => { + this.client.getContainer(name).stop({t: 5}, error => { if (error && error.statusCode !== 304) { containerServerActions.error({name, error}); return; @@ -341,12 +341,16 @@ export default { stream.on('data', json => { let data = JSON.parse(json); - if (data.status === 'pull' || data.status === 'untag' || data.status === 'delete') { + if (data.status === 'pull' || data.status === 'untag' || data.status === 'delete' || data.status === 'attach') { return; } if (data.status === 'destroy') { containerServerActions.destroyed({id: data.id}); + } else if (data.status === 'kill') { + containerServerActions.kill({id: data.id}); + } else if (data.status === 'stop') { + containerServerActions.stopped({id: data.id}); } else if (data.id) { this.fetchContainer(data.id); }