Exemple #1
0
var AppRouteDelete = Store.createClass({
	willInitialize: function () {
		this.props = {
			appID: this.id.appID,
			routeID: this.id.routeID
		};
	},

	didBecomeInactive: function () {
		this.constructor.discardInstance(this);
	},

	getInitialState: function () {
		return {
			isDeleting: false,
			errorMsg: null
		};
	},

	handleEvent: function (event) {
		switch (event.name) {
		case 'DELETE_APP_ROUTE':
			if (event.appID === this.props.appID && event.routeID === this.props.routeID) {
				this.setState({
					isDeleting: true,
					errorMsg: null
				});
			}
			break;

		case 'DELETE_APP_ROUTE_FAILED':
			if (event.appID === this.props.appID && event.routeID === this.props.routeID) {
				this.setState({
					errorMsg: 'Something went wrong ('+ event.status +')',
					isDeleting: false
				});
			}
			break;
		}
	}
});
Exemple #2
0
var AppRouteNew = Store.createClass({
	willInitialize: function () {
		this.props = {
			appID: this.id.appID
		};
	},

	didBecomeInactive: function () {
		this.constructor.discardInstance(this);
	},

	getInitialState: function () {
		return {
			isCreating: false,
			routeDomain: null,
			errorMsg: null
		};
	},

	handleEvent: function (event) {
		switch (event.name) {
			case 'CREATE_APP_ROUTE':
				if (event.appID === this.props.appID) {
					this.setState({
						errorMsg: null,
						isCreating: true,
						routeDomain: event.data.domain
					});
				}
			break;

			case 'ROUTE':
				if (event.app === this.props.appID && event.data.domain === this.state.routeDomain) {
					this.setState(this.getInitialState());
				}
			break;

			case 'CREATE_APP_ROUTE_FAILED':
				if (event.appID === this.props.appID && event.routeDomain === this.state.routeDomain) {
					this.setState({
						errorMsg: 'Something went wrong ('+ event.status +')',
						isCreating: false
					});
				}
			break;
		}
	}
});
Exemple #3
0
var ResourceAddApp = Store.createClass({
	willInitialize: function () {
		this.props = {
			appID: this.id.appID
		};
	},

	didBecomeInactive: function () {
		this.constructor.discardInstance(this);
	},

	getInitialState: function () {
		return {
			errMsg: null
		};
	},

	handleEvent: function (event) {
		switch (event.name) {
		case 'RESOURCE_ADD_APP':
			this.setState({
				errMsg: null
			});
			break;
		case 'RESOURCE_ADD_APP_FAILED':
			this.setState({
				errMsg: event.errMsg
			});
			break;
		}
	}
});
Exemple #4
0
var AppHistory = Store.createClass({
	willInitialize: function () {
		this.props = {
			appID: this.id.appID
		};

		this.fetchPageLock = Promise.resolve();
	},

	didBecomeActive: function () {
		if (this.state.pages.length === 0) {
			this.__fetchNextPage();
		}
	},

	didBecomeInactive: function () {
		this.constructor.discardInstance(this);
	},

	getInitialState: function () {
		return {
			hasPrevPage: true,
			hasNextPage: true,
			pages: [],
			eventIDs: [],
			beforeID: null,
			sinceID: null
		};
	},

	handleEvent: function (event) {
		if (event.app === this.props.appID && OBJECT_TYPES.indexOf(event.object_type) !== -1) {
			this.setState({
				hasPrevPage: true
			});
			return;
		}

		if (event.appID !== this.props.appID || event.name !== 'FETCH_APP_HISTORY') {
			return;
		}
		if (event.direction === 'prev') {
			this.__fetchPrevPage();
		} else {
			this.__fetchNextPage();
		}
	},

	__withFetchLock: function (callback) {
		return this.fetchPageLock.then(function () {
			this.fetchPageLock = new Promise(function (rs) {
				callback().then(rs);
			}.bind(this));
			return this.fetchPageLock;
		}.bind(this));
	},

	__fetchPrevPage: function (skipLock) {
		if (skipLock !== true) {
			return this.__withFetchLock(this.__fetchPrevPage.bind(this, true));
		}
		var prevState = this.state;
		return Config.client.getEvents({
			app_id: this.props.appID,
			since_id: this.state.sinceID,
			object_types: OBJECT_TYPES,
			count: FETCH_COUNT
		}).then(function (args) {
			var events = this.__rewriteEvents(this.__filterEvents(args[0]));
			var pages;
			var hasPrevPage = true;
			if (events.length === 0) {
				pages = prevState.pages;
				hasPrevPage = args[0].length !== 0;
			} else {
				pages = [{
					id: buildPageID(events),
					events: events
				}].concat(prevState.pages);
			}
			this.setState({
				hasPrevPage: hasPrevPage,
				pages: pages,
				eventIDs: prevState.eventIDs.concat(events.map(function (e) { return e.id; })),
				sinceID: ((args[0] || [])[0] || {}).id || prevState.sinceID
			});
		}.bind(this)).catch(function (err) {
			setTimeout(function () {
				throw err;
			}, 0);
		});
	},

	__fetchNextPage: function (skipLock, beforeID, eventsBuffer) {
		if (skipLock !== true) {
			return this.__withFetchLock(this.__fetchNextPage.bind(this, true));
		}
		if (this.state.hasNextPage === false) {
			return Promise.resolve();
		}
		var prevState = this.state;
		return Config.client.getEvents({
			app_id: this.props.appID,
			before_id: beforeID || this.state.beforeID,
			object_types: OBJECT_TYPES,
			count: FETCH_COUNT
		}).then(function (args) {
			var events = (eventsBuffer || []).concat(this.__rewriteEvents(this.__filterEvents(args[0])));
			var pages;
			var hasNextPage = true;
			var beforeID = ((args[0] || [])[args[0].length-1] || {}).id || prevState.beforeID;
			if (args[0].length > events.length) {
				return this.__fetchNextPage(skipLock, beforeID, events);
			}
			if (events.length === 0) {
				pages = prevState.pages;
				hasNextPage = args[0].length !== 0;
			} else {
				pages = prevState.pages.concat([{
					id: buildPageID(events),
					events: events
				}]);
			}
			var state = {
				hasNextPage: hasNextPage,
				pages: pages,
				eventIDs: prevState.eventIDs.concat(events.map(function (e) { return e.id; })),
				beforeID: ((args[0] || [])[args[0].length-1] || {}).id || prevState.beforeID
			};
			this.setState(state);
		}.bind(this)).catch(function (err) {
			setTimeout(function () {
				throw err;
			}, 0);
		});
	},

	__filterEvents: function (events) {
		return events.filter(function (event) {
			if (event.object_type === 'scale' && event.data.processes === null) {
				// don't show formation deletions
				return false;
			}
			if (event.object_type === 'scale' && !event.data.hasOwnProperty('prev_processes')) {
				// don't show scale events from deployments
				return false;
			}
			if (event.object_type === 'scale' && assertEqual(event.data.processes, event.data.prev_processes)) {
				// don't show scale events in which nothing's changed
				return false;
			}
			if (this.state.eventIDs.indexOf(event.id) !== -1) {
				// guard against duplicate events as this would break things
				return false;
			}
			return true;
		}, this);
	},

	__rewriteEvents: function (events) {
		return events.map(function (event) {
			if (event.object_type === 'app_release') {
				return this.__releaseEventWithDiff(event);
			}
			if (event.object_type === 'scale') {
				return this.__scaleEventWithDiff(event);
			}
			return event;
		}, this);
	},

	__releaseEventWithDiff: function (event) {
		var prevRelease = event.data.prev_release || {};
		var release = event.data.release;
		var envDiff = objectDiff(prevRelease.env || {}, release.env || {});
		return extend({}, event, {
			envDiff: envDiff
		});
	},

	__scaleEventWithDiff: function (event) {
		var prevProcesses = event.data.prev_processes || {};
		var processes = event.data.processes || {};
		var diff = objectDiff(prevProcesses, processes);
		var delta = 0;
		diff.forEach(function (d) {
			var k = d.key;
			delta += (processes[k] || 0) - (prevProcesses[k] || 0);
		});
		return extend({}, event, {
			delta: delta,
			diff: diff
		});
	}
});
Exemple #5
0
var AppDeploy = Store.createClass({
	willInitialize: function () {
		this.props = {
			appID: this.id.appID,
			sha: this.id.sha
		};
	},

	didBecomeActive: function () {
		if (this.props.appID !== null) {
			Dispatcher.dispatch({
				name: 'GET_DEPLOY_APP_JOB',
				appID: this.props.appID
			});
			Dispatcher.dispatch({
				name: 'GET_APP_RELEASE',
				appID: this.props.appID
			});
		}
	},

	didBecomeInactive: function () {
		this.constructor.discardInstance(this);
	},

	getInitialState: function () {
		return {
			taffyJob: null,
			release: null,
			launching: this.props.appID !== null,
			launchFailed: null,
			launchErrorMsg: null,
			launchSuccess: null
		};
	},

	handleEvent: function (event) {
		switch (event.name) {
			case 'JOB':
				if (event.taffy !== true || this.props.appID === null || (event.data.meta || {}).app !== this.props.appID || event.data.meta.sha !== this.props.sha) {
					return;
				}
				if (this.state.taffyJob === null || event.object_id === this.state.taffyJob.id) {
					this.setState({
						taffyJob: event.data,
						launching: (event.data.state !== 'down' && event.data.state !== 'crashed'),
						launchFailed: event.data.state === 'crashed',
						launchSuccess: event.data.state === 'down',
						launchErrorMsg: event.data.state === 'crashed' ? 'Non-zero exit status': null
					});
					return;
				}
			break;

			case 'APP':
				if (event.app === this.props.appID && event.data.release_id) {
					Dispatcher.dispatch({
						name: 'GET_APP_RELEASE',
						appID: this.props.appID
					});
				}
			break;

			case 'APP_RELEASE':
				if (event.app === this.props.appID) {
					this.setState({
						release: event.data
					});
				}
			break;
		}
	}
});