Last active
March 1, 2021 20:24
-
-
Save tkh44/8470feedec3b28e9d69c7eb8b28df41b 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) | |
| const initialContextValue = { | |
| error: undefined, | |
| target: { | |
| category: 'INFRASTRUCTURE', | |
| type: 'Hosts', | |
| strategy: 'RANDOM', | |
| selectedService: undefined, | |
| serviceTargets: [], | |
| targets: { | |
| Hosts: [], | |
| Containers: [], | |
| Applications: [], | |
| Kubernetes: [], | |
| Services: [] | |
| }, | |
| selectedTargets: new Set(), | |
| targetParams: {}, | |
| sampling: {} | |
| }, | |
| impact: { | |
| category: 'State', | |
| command: undefined, | |
| args: {} | |
| }, | |
| trigger: { | |
| /* | |
| type: trigger.type, | |
| exact: date | |
| start: trigger.start, | |
| end: trigger.end, | |
| activeDays: trigger.activeDays, | |
| maxRuns: trigger.maxRuns, | |
| timeZone: trigger.timeZone | |
| */ | |
| } | |
| } | |
| const fetchMachine = Machine( | |
| { | |
| id: 'createAttackForm', | |
| initial: 'loading', | |
| context: initialContextValue, | |
| states: { | |
| error: { | |
| on: { RETRY: 'loading' } | |
| }, | |
| loading: { | |
| invoke: { | |
| id: 'fetchTargets', | |
| src: 'fetchTargets', | |
| onDone: { | |
| target: 'target', | |
| actions: assign({ | |
| target: (context, event) => { | |
| const [clients, alfi, kubernetes, services] = event.data | |
| return { | |
| ...context.target, | |
| targets: { | |
| Hosts: clients, | |
| Containers: getContainersFromClients(clients), | |
| Applications: alfi, | |
| Kubernetes: kubernetes, | |
| Services: services | |
| } | |
| } | |
| } | |
| }) | |
| }, | |
| onError: { | |
| target: 'error', | |
| actions: assign({ | |
| error: (_, event) => event.data | |
| }) | |
| } | |
| }, | |
| on: { | |
| SUCCESS: 'target', | |
| ERROR: 'error' | |
| } | |
| }, | |
| target: { | |
| initial: 'targetCategory', | |
| on: { | |
| NEXT: { | |
| target: 'impact', | |
| actions: ['updateContext'] | |
| } | |
| }, | |
| states: { | |
| targetCategory: { | |
| on: { | |
| SELECT_INFRA: 'infrastructure', | |
| SELECT_SERVICES: 'services', | |
| SELECT_ALFI: 'applications' | |
| } | |
| }, | |
| infrastructure: { | |
| initial: 'host', | |
| on: { | |
| SELECT_HOSTS: '.host', | |
| SELECT_CONTAINERS: '.container', | |
| SELECT_KUBERNETES: '.kubernetes' | |
| }, | |
| states: { | |
| host: { | |
| initial: 'random', | |
| on: { | |
| SET_RANDOM: { | |
| target: '.random', | |
| actions: 'setRandomStrategy' | |
| }, | |
| SET_EXACT: { | |
| target: '.exact', | |
| actions: 'setExactStrategy' | |
| } | |
| }, | |
| states: { | |
| random: { | |
| on: { | |
| ADD_TARGET_PARAM: { | |
| actions: 'addTargetParam' | |
| }, | |
| REMOVE_TARGET_PARAM: { | |
| actions: 'removeTargetParam' | |
| } | |
| } | |
| }, | |
| exact: { | |
| on: { | |
| SELECT_TARGET: { | |
| actions: 'selectTarget' | |
| }, | |
| DESELECT_TARGET: { | |
| actions: 'deselectTarget' | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| container: { | |
| initial: 'random', | |
| on: { | |
| SET_RANDOM: { | |
| target: '.random', | |
| actions: 'setRandomStrategy' | |
| }, | |
| SET_EXACT: { | |
| target: '.exact', | |
| actions: 'setExactStrategy' | |
| } | |
| }, | |
| states: { | |
| random: { | |
| on: { | |
| ADD_TARGET_PARAM: { | |
| actions: 'addTargetParam' | |
| }, | |
| REMOVE_TARGET_PARAM: { | |
| actions: 'removeTargetParam' | |
| } | |
| } | |
| }, | |
| exact: { | |
| on: { | |
| SELECT_TARGET: { | |
| actions: 'selectTarget' | |
| }, | |
| DESELECT_TARGET: { | |
| actions: 'deselectTarget' | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| kubernetes: { | |
| initial: 'random', | |
| states: { | |
| random: { | |
| on: { | |
| ADD_TARGET_PARAM: { | |
| actions: 'addTargetParam' | |
| }, | |
| REMOVE_TARGET_PARAM: { | |
| actions: 'removeTargetParam' | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| services: { | |
| states: { | |
| loading: { | |
| invoke: { | |
| id: 'fetchServices', | |
| src: 'fetchServices', | |
| onDone: { | |
| target: 'selectService', | |
| actions: assign({ | |
| target: (context, event) => { | |
| const services = event.data | |
| return { | |
| ...context.target, | |
| targets: { | |
| ...context.target.targets, | |
| Services: services | |
| } | |
| } | |
| } | |
| }) | |
| }, | |
| onError: { | |
| target: 'error' | |
| } | |
| } | |
| }, | |
| error: { | |
| on: { | |
| RETRY: 'loading' | |
| } | |
| }, | |
| selectService: { | |
| on: { | |
| SELECT_SERVICE: [ | |
| { | |
| action: 'selectService', | |
| target: 'host', | |
| cond: (ctx, event) => event.service && event.service.provenance === 'PROCESSDATA' | |
| }, | |
| { | |
| action: 'selectService', | |
| target: 'container', | |
| cond: (ctx, event) => event.service && event.service.provenance === 'CONTAINER' | |
| }, | |
| { | |
| action: 'selectService', | |
| target: 'kubernetes', | |
| cond: (ctx, event) => event.service && event.service.provenance === 'KUBERNETES' | |
| } | |
| ] | |
| } | |
| }, | |
| host: { | |
| initial: 'random', | |
| states: { | |
| random: { | |
| on: { | |
| ADD_TARGET_PARAM: { | |
| actions: 'addTargetParam' | |
| }, | |
| REMOVE_TARGET_PARAM: { | |
| actions: 'removeTargetParam' | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| container: { | |
| initial: 'random', | |
| states: { | |
| random: { | |
| on: { | |
| ADD_TARGET_PARAM: { | |
| actions: 'addTargetParam' | |
| }, | |
| REMOVE_TARGET_PARAM: { | |
| actions: 'removeTargetParam' | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| kubernetes: { | |
| initial: 'loading', | |
| states: { | |
| loading: { | |
| invoke: { | |
| id: 'fetchServiceKubernetesTargets', | |
| src: 'fetchServiceKubernetesTargets', | |
| onDone: { | |
| target: 'random', | |
| actions: assign({ | |
| target: (context, event) => { | |
| const kubernetesTargets = event.data | |
| return { | |
| ...context.target, | |
| serviceTargets: { | |
| ...context.target.targets, | |
| Kubernetes: kubernetesTargets | |
| } | |
| } | |
| } | |
| }) | |
| }, | |
| onError: { | |
| target: 'error' | |
| } | |
| } | |
| }, | |
| error: { | |
| on: { | |
| RETRY: 'loading' | |
| } | |
| }, | |
| random: { | |
| on: { | |
| ADD_TARGET_PARAM: { | |
| actions: 'addTargetParam' | |
| }, | |
| REMOVE_TARGET_PARAM: { | |
| actions: 'removeTargetParam' | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| applications: { | |
| type: 'final' | |
| } | |
| } | |
| }, | |
| impact: { | |
| on: { | |
| BACK: { | |
| target: 'target', | |
| actions: ['updateContext'] | |
| }, | |
| NEXT: { | |
| target: 'trigger', | |
| actions: ['updateContext'] | |
| }, | |
| SUBMIT: 'submitting' | |
| }, | |
| states: { | |
| category: { | |
| on: { | |
| SELECT_CATEGORY: { | |
| target: 'command', | |
| action: 'selectAttackCategory' | |
| } | |
| } | |
| }, | |
| command: { | |
| on: { | |
| SELECT_COMMAND: { | |
| target: 'args', | |
| action: 'selectAttackCommand' | |
| } | |
| } | |
| }, | |
| args: { | |
| on: { | |
| UPDATE_FIELD: { | |
| action: 'updateArg' | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| trigger: { | |
| on: { | |
| BACK: { | |
| target: 'impact', | |
| actions: ['updateContext'] | |
| }, | |
| SUBMIT: { | |
| target: 'submitting', | |
| actions: ['updateContext'] | |
| } | |
| } | |
| }, | |
| submitting: { | |
| on: { | |
| SUCCESS: 'created', | |
| ERROR: 'submitError' | |
| } | |
| }, | |
| submitError: { | |
| on: { | |
| SUBMIT: 'submitting', | |
| ERROR: 'submitError' | |
| } | |
| }, | |
| created: { | |
| type: 'final' | |
| } | |
| } | |
| }, | |
| { | |
| actions: { | |
| updateContext: assign((context, event) => { | |
| const { type, ...rest } = event | |
| if (type) { | |
| return merge({}, context, rest) | |
| } | |
| }) | |
| }, | |
| services: { | |
| fetchTargets: () => Promise.resolve([]) | |
| } | |
| } | |
| ) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment