From 50e20d654ed7033309d4b2f327e0357b8334b580 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Thu, 25 Jan 2018 17:18:36 -0800 Subject: [PATCH] Documentation updates --- HOWTOCONTRIBUTE.md | 6 +++--- README.md | 42 +++++++++++++++++++++++++++++++++--------- SIA-Architecture.png | Bin 0 -> 23838 bytes 3 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 SIA-Architecture.png diff --git a/HOWTOCONTRIBUTE.md b/HOWTOCONTRIBUTE.md index 166e432..d76c650 100644 --- a/HOWTOCONTRIBUTE.md +++ b/HOWTOCONTRIBUTE.md @@ -23,11 +23,11 @@ Issues labeled beginner are good candidates to pick up if you are in the code fo ## Configurations ### For Development * Follow instructions in the README.md files in each of the child repositories. - * [Sia-Gateway](https://github.com/Azure/Sia-Gateway/blob/master/src/Sia.Gateway/README.md) (located in Sia-Gateway/src/Sia.Gateway/README.md) - * [Sia-EventUi](https://github.com/Azure/Sia-EventUI/blob/master/README.md) (located in Sia-EventUI/README.md) + * [Sia-Gateway](https://github.com/Azure/Sia-Gateway) (located in `README.md`) + * [Sia-EventUi](https://github.com/Azure/Sia-EventUI/blob/master/README.md) (located in `README.md`) ### For A Functional, Authenticated Environment -//Todo: Instructions for configuring Azure resources +// Todo: Instructions for configuring Azure resources ## Build Launch Gateway from VS2017 or VS Code diff --git a/README.md b/README.md index fb8b76e..ce2eb25 100644 --- a/README.md +++ b/README.md @@ -14,19 +14,43 @@ Software systems are only as effective as they are reliable. As online services ## The solution The SRE Incident Assistant (SIA) is designed to facilitate coordination, communication, and mitigation activities in 'worst case scenario' outages while gathering data for use in postmortem and process improvement. +## Service Architecture Overview +![SIA service architecture](SIA-Architecture.png) + +Definitions: + +| Term | Definition | Repo | +| ---- | ---------- | ---- | +| **SIA Root** | Domain objects that make communication between the Gateway and Services easier | [https://github.com/Azure/Sia-Root](https://github.com/Azure/Sia-Root) | +| **Incident Management Data Source** | A ticketing system | +| **ICM Connector** | Connects an event source to the SIA Gateway | [https://github.com/Azure/Sia-Gateway/tree/master/src/Sia.Connectors.Tickets](https://github.com/Azure/Sia-Gateway/tree/master/src/Sia.Connectors.Tickets) (part of the Sia-Gateway project)| +| **SIA Gateway** | Web API service that receives events, sends events to the Event UI, and to other services | [https://github.com/Azure/Sia-Gateway](https://github.com/Azure/Sia-Gateway) | +| **Services** | Third party services receive events and respond (e.g. with suggested courses of action) based on their internal business logic. Use the Domain objects defined in [Sia-Root](https://github.com/Azure/Sia-Root) | You create services | +| **Event UI** | User interface for SIA | [https://github.com/Azure/Sia-EventUI](https://github.com/Azure/Sia-EventUI) | + # Quick Start +Get up and running with a local resources. + * [Install prerequisites](https://github.com/Azure/Sia-Root/blob/master/HOWTOCONTRIBUTE.md#installing-prerequisites) - * For Windows Users, the PowerShell script (installEventUI.ps1) can help installing the prerequisites, as well as cloning the UI repos. + * For Windows Users, the PowerShell script (`installEventUI.ps1`) can help installing the prerequisites, as well as cloning the UI repos. * Clone the repos: - * Gateway: git clone [https://github.com/Azure/Sia-Gateway](https://github.com/Azure/Sia-Gateway) - * UI: git clone [https://github.com/Azure/Sia-EventUi](https://github.com/Azure/Sia-EventUi) -* Init the submodule from the gateway root directory - * git submodule init - * git submodule update --remote + * **Gateway:** [https://github.com/Azure/Sia-Gateway](https://github.com/Azure/Sia-Gateway) (Make sure to initalize the submodules) + ``` + git clone https://github.com/Azure/Sia-Root + git submodule init + git submodule update + ``` + * **UI:** git clone [https://github.com/Azure/Sia-EventUi](https://github.com/Azure/Sia-EventUi) + ``` + git clone https://github.com/Azure/Sia-EventUi + ``` + * Update the [configurations](https://github.com/Azure/Sia-Root/blob/master/HOWTOCONTRIBUTE.md#development-workflow) -* Launch Gateway form Visual Studio 2017 or Visual Studio Code -* Start UI with npm - * npm start +* Launch + * Additional services + * Gateway (Follow instructions at [https://github.com/Azure/Sia-Gateway](https://github.com/Azure/Sia-Gateway)) + * Event UI (Follow instructions at [https://github.com/Azure/Sia-EventUI](https://github.com/Azure/Sia-EventUI)) (`npm start` for local development) + * Open [http://localhost:3000](http://localhost:3000) in your browser, and voilĂ  ## Contributing diff --git a/SIA-Architecture.png b/SIA-Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..0c7879f3b9865b453bace14f9be13e74ca417894 GIT binary patch literal 23838 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 z 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 b>K5)9jyqRmTtU#YO8a>QZRLIU{jvW5DQ>{H literal 0 HcmV?d00001