Created
November 14, 2019 23:26
-
-
Save klundberg/4cfc4998d713c99e3d7337915e598808 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Available variables: | |
| // - Machine | |
| // - interpret | |
| // - assign | |
| // - send | |
| // - sendParent | |
| // - spawn | |
| // - raise | |
| // - actions | |
| // - XState (all XState exports) | |
| // helper functions | |
| function getTransitionDefinitions(transitions) { | |
| return transitions.reduce( | |
| (transitionsSoFar, transition) => ({ | |
| ...transitionsSoFar, | |
| [transition]: TransitionDefinitions[transition] | |
| }), | |
| {} | |
| ); | |
| }; | |
| const StateMachineContextNames = { | |
| START_TIME_CURRENT_STATE: 'startTimeCurrentState', | |
| TAG: 'tag', | |
| SELECTED_DEPLOY_REQUEST_IDS: 'selectedDeployRequestIds', | |
| MAESTRO: 'maestro', | |
| ROLLBACK_START_TIME: 'rollbackStartTime', | |
| HAS_BEEN_DEPLOYED_TO_PROD: 'hasBeenDeployedToProd' | |
| }; | |
| const ActionNames = { | |
| logError: 'logError', | |
| logEnteredState: 'logEnteredState', | |
| logExitedState: 'logExitedState', | |
| logEventTransition: 'logEventTransition' | |
| }; | |
| const GuardNames = { | |
| childMachineSucceeded: 'childMachineSucceeded' | |
| }; | |
| const States = { | |
| waitingForInteraction: 'waitingForInteraction', | |
| creatingBatch: 'creatingBatch', | |
| integratingDeployRequests: 'integratingDeployRequests', | |
| building: 'building', | |
| reverting: 'reverting', | |
| deployingToCanary: 'deployingToCanary', | |
| deployingToStaging: 'deployingToStaging', | |
| deployingToProduction: 'deployingToProduction', | |
| finalizing: 'finalizing', | |
| canceling: 'canceling', | |
| restarting: 'restarting', | |
| mergingMasterIntoBatch: 'mergingMasterIntoBatch', | |
| rollingback: 'rollingback', | |
| done: 'done' | |
| }; | |
| const Actions = { | |
| setTagInContext: 'setTagInContext', | |
| logDeployRequestsRolledBack: 'logDeployRequestsRolledBack', | |
| setRollbackStartTimeInContext: 'setRollbackStartTimeInContext', | |
| logRollbackDuration: 'logRollbackDuration', | |
| ...ActionNames | |
| }; | |
| const Guards = { | |
| ...GuardNames, | |
| autoDeployToStaging: 'autoDeployToStaging' | |
| }; | |
| const Services = { | |
| createBatchMachine: 'createBatchMachine', | |
| integrateDeployRequestsMachine: 'integrateDeployRequestsMachine', | |
| buildMachine: 'buildMachine', | |
| revertMachine: 'revertMachine', | |
| deployCanaryMachine: 'deployCanaryMachine', | |
| deployStagingMachine: 'deployStagingMachine', | |
| deployProductionMachine: 'deployProductionMachine', | |
| rollbackMachine: 'rollbackMachine', | |
| finalizeMachine: 'finalizeMachine', | |
| cancelBatchMachine: 'cancelBatchMachine', | |
| restartBatchMachine: 'restartBatchMachine', | |
| mergeMasterIntoBatchMachine: 'mergeMasterIntoBatchMachine' | |
| }; | |
| const StateMachineEventMap = { | |
| DEPLOY_TO_STAGING: 'deployToStaging', | |
| TRIGGER_STAGING_TESTS: 'triggerStagingTests', | |
| DEPLOY_TO_CANARY: 'deployToCanary', | |
| DEPLOY_TO_PRODUCTION: 'deployToProduction', | |
| ROLLBACK: 'rollback', | |
| REVERT_DEPLOY_REQUESTS: 'revertDeployRequests', | |
| FINALIZE_BATCH: 'finalizeBatch', | |
| CANCEL_BATCH: 'cancelBatch', | |
| RESTART_BATCH: 'restartBatch', | |
| MERGE_MASTER_INTO_BATCH: 'mergeMasterIntoBatch', | |
| RETRY_BUILD: 'retryBuild', | |
| PUSH_TO_REMOTE: 'pushRepoToRemoteMachine', | |
| TRIGGER_BRANCH_TESTS: 'triggeringBranchTests', | |
| POLLING_STATUS: 'pollBuildStatusMachine', | |
| DEPLOY_PIB_TO_STAGING: 'deployPibToStaging', | |
| PUSH_MASTER_TO_REMOTE: 'pushMasterToRemote', | |
| MERGE_INTEGRATION_BRANCH_INTO_MASTER: 'mergeIntegrationBranchIntoMaster' | |
| }; | |
| const MachineNames = { | |
| BATCH: 'batchMachine', | |
| APP_BATCH: 'appBatchMachine', | |
| BUILD: 'buildMachine', | |
| DEPLOY_STAGING: 'deployStagingMachine', | |
| FINALIZE_BATCH: 'finalizeBatchMachine', | |
| MERGE_MASTER_INTO_BATCH: 'mergeMasterIntoBatchMachine' | |
| }; | |
| const MachineNameEventMap = { | |
| [MachineNames.BATCH]: [ | |
| StateMachineEventMap.DEPLOY_TO_STAGING, | |
| StateMachineEventMap.DEPLOY_TO_CANARY, | |
| StateMachineEventMap.DEPLOY_TO_PRODUCTION, | |
| StateMachineEventMap.ROLLBACK, | |
| StateMachineEventMap.REVERT_DEPLOY_REQUESTS, | |
| StateMachineEventMap.FINALIZE_BATCH, | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH, | |
| StateMachineEventMap.MERGE_MASTER_INTO_BATCH, | |
| StateMachineEventMap.MERGE_MASTER_INTO_BATCH | |
| ], | |
| [MachineNames.BUILD]: [ | |
| StateMachineEventMap.RETRY_BUILD, | |
| StateMachineEventMap.PUSH_TO_REMOTE, | |
| StateMachineEventMap.TRIGGER_BRANCH_TESTS | |
| ], | |
| [MachineNames.FINALIZE_BATCH]: [ | |
| StateMachineEventMap.PUSH_TO_REMOTE, | |
| StateMachineEventMap.MERGE_INTEGRATION_BRANCH_INTO_MASTER | |
| ], | |
| [MachineNames.DEPLOY_STAGING]: [StateMachineEventMap.TRIGGER_STAGING_TESTS] | |
| }; | |
| const TransitionDefinitions = { | |
| [StateMachineEventMap.DEPLOY_TO_STAGING]: { | |
| actions: Actions.logEventTransition, | |
| target: States.deployingToStaging | |
| }, | |
| [StateMachineEventMap.DEPLOY_TO_CANARY]: { | |
| actions: Actions.logEventTransition, | |
| target: States.deployingToCanary | |
| }, | |
| [StateMachineEventMap.DEPLOY_TO_PRODUCTION]: { | |
| actions: Actions.logEventTransition, | |
| target: States.deployingToProduction | |
| }, | |
| [StateMachineEventMap.FINALIZE_BATCH]: { | |
| actions: Actions.logEventTransition, | |
| target: States.finalizing | |
| }, | |
| [StateMachineEventMap.CANCEL_BATCH]: { | |
| actions: Actions.logEventTransition, | |
| target: States.canceling | |
| }, | |
| [StateMachineEventMap.RESTART_BATCH]: { | |
| actions: Actions.logEventTransition, | |
| target: States.restarting | |
| }, | |
| [StateMachineEventMap.REVERT_DEPLOY_REQUESTS]: { | |
| actions: Actions.logEventTransition, | |
| target: States.reverting | |
| }, | |
| [StateMachineEventMap.MERGE_MASTER_INTO_BATCH]: { | |
| actions: Actions.logEventTransition, | |
| target: States.mergingMasterIntoBatch | |
| }, | |
| [StateMachineEventMap.ROLLBACK]: { | |
| actions: Actions.logEventTransition, | |
| target: States.rollingback | |
| } | |
| }; | |
| const AppStateTransitionsMap = { | |
| [States.waitingForInteraction]: getTransitionDefinitions([ | |
| StateMachineEventMap.REVERT_DEPLOY_REQUESTS, | |
| StateMachineEventMap.ROLLBACK, | |
| StateMachineEventMap.FINALIZE_BATCH, | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH, | |
| StateMachineEventMap.MERGE_MASTER_INTO_BATCH | |
| ]), | |
| [States.creatingBatch]: getTransitionDefinitions([ | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH | |
| ]), | |
| [States.integratingDeployRequests]: getTransitionDefinitions([ | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH | |
| ]), | |
| [States.building]: getTransitionDefinitions([ | |
| StateMachineEventMap.REVERT_DEPLOY_REQUESTS, | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH, | |
| StateMachineEventMap.MERGE_MASTER_INTO_BATCH | |
| ]), | |
| [States.reverting]: getTransitionDefinitions([ | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH | |
| ]), | |
| [States.rollingback]: getTransitionDefinitions([ | |
| StateMachineEventMap.REVERT_DEPLOY_REQUESTS, | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH, | |
| StateMachineEventMap.MERGE_MASTER_INTO_BATCH | |
| ]), | |
| [States.restarting]: getTransitionDefinitions([]), | |
| [States.mergingMasterIntoBatch]: getTransitionDefinitions([ | |
| StateMachineEventMap.CANCEL_BATCH, | |
| StateMachineEventMap.RESTART_BATCH | |
| ]), | |
| [States.canceling]: getTransitionDefinitions([]), | |
| [States.finalizing]: getTransitionDefinitions([]), | |
| [States.done]: getTransitionDefinitions([]) | |
| }; | |
| const appBatchMachine = Machine({ | |
| strict: true, | |
| id: MachineNames.APP_BATCH, | |
| initiali: States.creatingBatch, | |
| initial: States.creatingBatch, | |
| context: { | |
| [StateMachineContextNames.TAG]: null, | |
| [StateMachineContextNames.SELECTED_DEPLOY_REQUEST_IDS]: null, | |
| [StateMachineContextNames.MAESTRO]: null, | |
| [StateMachineContextNames.START_TIME_CURRENT_STATE]: null, | |
| [StateMachineContextNames.ROLLBACK_START_TIME]: null | |
| }, | |
| states: { | |
| [States.waitingForInteraction]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| on: AppStateTransitionsMap[States.waitingForInteraction] | |
| }, | |
| [States.creatingBatch]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'createBatchMachine', | |
| src: Services.createBatchMachine, | |
| onDone: [ | |
| { | |
| target: States.integratingDeployRequests, | |
| cond: Guards.childMachineSucceeded, | |
| actions: Actions.setTagInContext | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.creatingBatch] | |
| }, | |
| [States.integratingDeployRequests]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'integrateDeployRequestsMachine', | |
| src: Services.integrateDeployRequestsMachine, | |
| onDone: [ | |
| { | |
| target: States.building, | |
| cond: Guards.childMachineSucceeded | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.integratingDeployRequests] | |
| }, | |
| [States.building]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'buildMachine', | |
| src: Services.buildMachine, | |
| onDone: [ | |
| { | |
| target: States.finalizing, | |
| cond: Guards.childMachineSucceeded | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.building] | |
| }, | |
| [States.reverting]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'revertMachine', | |
| src: Services.revertMachine, | |
| onDone: [ | |
| { | |
| target: States.building, | |
| cond: Guards.childMachineSucceeded | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.reverting] | |
| }, | |
| [States.rollingback]: { | |
| entry: [ | |
| Actions.logEnteredState, | |
| Actions.logDeployRequestsRolledBack, | |
| Actions.logDeployRequestsRolledBack, | |
| Actions.setRollbackStartTimeInContext | |
| ], | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'rollbackMachine', | |
| src: Services.rollbackMachine, | |
| onDone: States.waitingForInteraction | |
| }, | |
| on: AppStateTransitionsMap[States.rollingback] | |
| }, | |
| [States.restarting]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'restartBatchMachine', | |
| src: Services.restartBatchMachine, | |
| onDone: [ | |
| { | |
| target: States.creatingBatch, | |
| cond: Guards.childMachineSucceeded | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.restarting] | |
| }, | |
| [States.mergingMasterIntoBatch]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'mergeMasterIntoBatchMachine', | |
| src: Services.mergeMasterIntoBatchMachine, | |
| onDone: [ | |
| { | |
| target: States.building, | |
| cond: Guards.childMachineSucceeded | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.mergingMasterIntoBatch] | |
| }, | |
| [States.canceling]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'cancelBatchMachine', | |
| src: Services.cancelBatchMachine, | |
| onDone: [ | |
| { | |
| target: States.done, | |
| cond: Guards.childMachineSucceeded | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.canceling] | |
| }, | |
| [States.finalizing]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| invoke: { | |
| id: 'finalizeMachine', | |
| src: Services.finalizeMachine, | |
| onDone: [ | |
| { | |
| target: States.done, | |
| cond: Guards.childMachineSucceeded | |
| }, | |
| {target: States.waitingForInteraction} | |
| ] | |
| }, | |
| on: AppStateTransitionsMap[States.finalizing] | |
| }, | |
| [States.done]: { | |
| entry: Actions.logEnteredState, | |
| exit: Actions.logExitedState, | |
| type: 'final' | |
| } | |
| } | |
| }); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment