Skip to content

Commit

Permalink
Add Auth plus namespace Locking
Browse files Browse the repository at this point in the history
  • Loading branch information
Kyle Rockman committed Sep 6, 2017
1 parent f4c378a commit ffba4f1
Show file tree
Hide file tree
Showing 25 changed files with 518 additions and 93 deletions.
21 changes: 21 additions & 0 deletions estate/assets/js/api/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*global dispatch*/
import axios from "axios"
import * as messages from "./messages"

export function login(user, pass) {
dispatch({ type: "START_LOGIN"})
const req = axios.post(`/api/token/`, {username: user, password: pass})
req.then((res) => {
dispatch({
type: "FINISH_LOGIN",
payload: res.data,
})
}, (err) => {
dispatch({
type: "FINISH_LOGIN",
payload: {token: null}
})
messages.handleResponseError(err)
})
return req
}
97 changes: 73 additions & 24 deletions estate/assets/js/api/terraform.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import * as messages from "./messages"

export function getNamespaces(page, pagesize, search) {
dispatch({ type: "LOADING_NAMESPACES"})
const req = axios.get(`/api/terraform/namespace/?page=${page}&page_size=${pagesize}&search=${search}`)
const req = axios.get(`/api/v1/terraform/namespace/?page=${page}&page_size=${pagesize}&search=${search}`)
req.then((res) => {
dispatch({
type: "LIST_NAMESPACES",
Expand All @@ -21,7 +21,7 @@ export function getNamespaces(page, pagesize, search) {

export function getNamespace(slug) {
dispatch({ type: "LOADING_NAMESPACES"})
const req = axios.get(`/api/terraform/namespace/?slug=${slug}`)
const req = axios.get(`/api/v1/terraform/namespace/?slug=${slug}`)
req.then((res) => {
if (res.data.length > 0){
dispatch({
Expand All @@ -37,7 +37,7 @@ export function getNamespace(slug) {
}

export function createNamespace(payload) {
const req = axios.post("/api/terraform/namespace/", payload)
const req = axios.post("/api/v1/terraform/namespace/", payload)
req.then((res) => {
dispatch({
type: "UPDATE_NAMESPACE",
Expand All @@ -48,7 +48,7 @@ export function createNamespace(payload) {
}

export function updateNamespace(id, payload) {
const req = axios.patch(`/api/terraform/namespace/${id}/`, payload)
const req = axios.patch(`/api/v1/terraform/namespace/${id}/`, payload)
req.then((res) => {
dispatch({
type: "UPDATE_NAMESPACE",
Expand All @@ -60,7 +60,7 @@ export function updateNamespace(id, payload) {
}

export function deleteNamespace(id) {
const req = axios.delete(`/api/terraform/namespace/${id}/`)
const req = axios.delete(`/api/v1/terraform/namespace/${id}/`)
req.then(() => {
dispatch({
type: "DELETE_NAMESPACE",
Expand All @@ -71,63 +71,63 @@ export function deleteNamespace(id) {
}

export function addFileToNamespace(payload) {
const req = axios.post("/api/terraform/file/", payload)
const req = axios.post("/api/v1/terraform/file/", payload)
req.then(() => {
getNamespace(payload.namespace)
}, messages.handleResponseError)
return req
}

export function updateFile(id, payload) {
const req = axios.patch(`/api/terraform/file/${id}/`, payload)
const req = axios.patch(`/api/v1/terraform/file/${id}/`, payload)
req.then((res) => {
getNamespace(res.data.namespace)
}, messages.handleResponseError)
return req
}

export function removeFileFromNamespace(slug, id) {
const req = axios.delete(`/api/terraform/file/${id}/`)
const req = axios.delete(`/api/v1/terraform/file/${id}/`)
req.then(() => {
getNamespace(slug)
}, messages.handleResponseError)
return req
}

export function addTemplateToNamespace(payload) {
const req = axios.post("/api/terraform/templateinstance/", payload)
const req = axios.post("/api/v1/terraform/templateinstance/", payload)
req.then(() => {
getNamespace(payload.namespace)
}, messages.handleResponseError)
return req
}

export function updateTemplateInstance(id, payload) {
const req = axios.patch(`/api/terraform/templateinstance/${id}/`, payload)
const req = axios.patch(`/api/v1/terraform/templateinstance/${id}/`, payload)
req.then((res) => {
getNamespace(res.data.namespace)
}, messages.handleResponseError)
return req
}

export function updateTemplateOfTemplateInstance(id) {
const req = axios.post(`/api/terraform/templateinstance/${id}/update_template/`)
const req = axios.post(`/api/v1/terraform/templateinstance/${id}/update_template/`)
req.then((res) => {
getNamespace(res.data.namespace)
}, messages.handleResponseError)
return req
}

export function removeTemplateFromNamespace(slug, id) {
const req = axios.delete(`/api/terraform/templateinstance/${id}/`)
const req = axios.delete(`/api/v1/terraform/templateinstance/${id}/`)
req.then(() => {
getNamespace(slug)
}, messages.handleResponseError)
return req
}

export function getPlanForNamespace(id) {
const req = axios.get(`/api/terraform/namespace/${id}/plan_live/`)
const req = axios.get(`/api/v1/terraform/namespace/${id}/plan_live/`)
req.then((res) => {
dispatch({
type: "PLAN_NAMESPACE",
Expand All @@ -140,7 +140,7 @@ export function getPlanForNamespace(id) {
export function doPlanForNamespace(id) {
dispatch({type: "CLEAR_PLAN_NAMESPACE"})
let loopId = setInterval(() => {getPlanForNamespace(id)}, 1000)
const req = axios.post(`/api/terraform/namespace/${id}/plan/`)
const req = axios.post(`/api/v1/terraform/namespace/${id}/plan/`)
req.then((res) => {
clearInterval(loopId)
dispatch({
Expand All @@ -155,7 +155,7 @@ export function doPlanForNamespace(id) {
}

export function getApplyForNamespace(id) {
const req = axios.get(`/api/terraform/namespace/${id}/apply_live/`)
const req = axios.get(`/api/v1/terraform/namespace/${id}/apply_live/`)
req.then((res) => {
dispatch({
type: "APPLY_NAMESPACE",
Expand All @@ -168,7 +168,7 @@ export function getApplyForNamespace(id) {
export function doApplyForNamespace(id, plan_hash) {
dispatch({type: "CLEAR_APPLY_NAMESPACE"})
let loopId = setInterval(() => {getApplyForNamespace(id)}, 1000)
const req = axios.post(`/api/terraform/namespace/${id}/apply/${plan_hash}/`)
const req = axios.post(`/api/v1/terraform/namespace/${id}/apply/${plan_hash}/`)
req.then((res) => {
clearInterval(loopId)
dispatch({
Expand All @@ -183,9 +183,8 @@ export function doApplyForNamespace(id, plan_hash) {
}

export function getStateForNamespace(id) {
const req = axios.get(`/api/terraform/state/?namespace=${id}`)
const req = axios.get(`/api/v1/terraform/state/?namespace=${id}`)
req.then((res) => {
console.log(res)
dispatch({
type: "UPDATE_STATEFILE",
payload: res.data[0]
Expand All @@ -194,9 +193,59 @@ export function getStateForNamespace(id) {
return req
}

export function getExperimentForNamespace(id) {
const req = axios.get(`/api/v1/terraform/namespace/${id}/experiment_live/`)
req.then((res) => {
dispatch({
type: "EXPERIMENT_NAMESPACE",
payload: res.data
})
}, messages.handleResponseError)
return req
}

export function doExperimentForNamespace(id, repl_command) {
dispatch({type: "CLEAR_EXPERIMENT_NAMESPACE"})
let loopId = setInterval(() => {getExperimentForNamespace(id)}, 1000)
const req = axios.post(`/api/v1/terraform/namespace/${id}/experiment/`, {"repl_command": repl_command})
req.then((res) => {
clearInterval(loopId)
dispatch({
type: "EXPERIMENT_NAMESPACE",
payload: res.data
})
}, (err) => {
clearInterval(loopId)
messages.handleResponseError(err)
})
return req
}

export function lockNamespace(id) {
const req = axios.post(`/api/v1/terraform/namespace/${id}/lock/`)
req.then((res) => {
dispatch({
type: "UPDATE_NAMESPACE",
payload: res.data
})
}, messages.handleResponseError)
return req
}

export function unlockNamespace(id) {
const req = axios.post(`/api/v1/terraform/namespace/${id}/unlock/`)
req.then((res) => {
dispatch({
type: "UPDATE_NAMESPACE",
payload: res.data
})
}, messages.handleResponseError)
return req
}

export function getTemplates(page, pagesize, search) {
dispatch({ type: "LOADING_TEMPLATES"})
const req = axios.get(`/api/terraform/template/?page=${page}&page_size=${pagesize}&search=${search}`)
const req = axios.get(`/api/v1/terraform/template/?page=${page}&page_size=${pagesize}&search=${search}`)
req.then((res) => {
dispatch({
type: "LIST_TEMPLATES",
Expand All @@ -213,7 +262,7 @@ export function getTemplates(page, pagesize, search) {

export function getTemplate(slug) {
dispatch({ type: "LOADING_TEMPLATES"})
const req = axios.get(`/api/terraform/template/?slug=${slug}`)
const req = axios.get(`/api/v1/terraform/template/?slug=${slug}`)
req.then((res) => {
if (res.data.length > 0){
dispatch({
Expand All @@ -229,7 +278,7 @@ export function getTemplate(slug) {
}

export function createTemplate(payload) {
const req = axios.post("/api/terraform/template/", payload)
const req = axios.post("/api/v1/terraform/template/", payload)
req.then((res) => {
dispatch({
type: "UPDATE_TEMPLATE",
Expand All @@ -240,7 +289,7 @@ export function createTemplate(payload) {
}

export function updateTemplate(id, payload) {
const req = axios.patch(`/api/terraform/template/${id}/`, payload)
const req = axios.patch(`/api/v1/terraform/template/${id}/`, payload)
req.then((res) => {
dispatch({
type: "UPDATE_TEMPLATE",
Expand All @@ -252,7 +301,7 @@ export function updateTemplate(id, payload) {
}

export function renderTemplate(payload) {
const req = axios.post("/api/terraform/template/render/", payload)
const req = axios.post("/api/v1/terraform/template/render/", payload)
req.then((res) => {
dispatch({
type: "RENDER_TEMPLATE",
Expand All @@ -263,7 +312,7 @@ export function renderTemplate(payload) {
}

export function deleteTemplate(id) {
const req = axios.delete(`/api/terraform/template/${id}/`)
const req = axios.delete(`/api/v1/terraform/template/${id}/`)
req.then(() => {
dispatch({
type: "DELETE_TEMPLATE",
Expand Down
7 changes: 5 additions & 2 deletions estate/assets/js/components/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from "react"
import { Route } from "react-router-dom"
import Nav from "./Nav"
import Messages from "./Messages"
import Login from "./Login"
import Home from "./Home"
import TerraformRoutes from "./TerraformRoutes"

Expand All @@ -14,8 +15,10 @@ export default class App extends React.Component {
<Messages />
<div className="container-fluid">
<div className="row">
<Route exact path="/" component={Home} />
<Route path="/terraform/" component={TerraformRoutes} />
<Login>
<Route exact path="/" component={Home} />
<Route path="/terraform/" component={TerraformRoutes} />
</Login>
</div>
</div>
</div>
Expand Down
22 changes: 3 additions & 19 deletions estate/assets/js/components/Editor.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from "react"
import { assign, cloneDeep } from "lodash"
import CodeMirror from "react-codemirror"
import CodeMirror from '@skidding/react-codemirror';
import "codemirror/lib/codemirror.css"
import "codemirror/mode/yaml/yaml.js"
import "codemirror/mode/javascript/javascript.js"
Expand Down Expand Up @@ -49,29 +49,13 @@ var count = 0
export default class Editor extends React.Component {
constructor(props, context) {
super(props, context)
this.state = this.prepareContent.bind(this)(props)
this.state.changed = false
}
componentWillReceiveProps(nextProps) {
this.setState(this.prepareContent.bind(this)(nextProps))
}
prepareContent(props) {
const currentContent = props.content.replace(re,"\n")
var initialContent = cloneDeep(currentContent)
if (props.initialContent)
initialContent = props.initialContent.replace(re,"\n")
return {
initialContent: initialContent,
currentContent: currentContent,
}
}
updateContent(value) {
const changed = (this.state.initialContent != value)
const changed = (this.props.content.replace(re,"\n") != value)
const data = {
currentContent: value,
changed: changed
}
this.setState(data)
if (this.props.onUpdateContent) {
this.props.onUpdateContent(data)
}
Expand All @@ -91,7 +75,7 @@ export default class Editor extends React.Component {
<div id={id} className="panel-collapse collapse in">
<div className="panel-body" style={{ padding: "0px" }}>
<div style={{border: "solid", borderWidth: "1px", clear: "left"}}>
<CodeMirror ref="editor" defaultValue={this.state.currentContent} value={this.state.currentContent} onChange={this.updateContent.bind(this)} options={options} autoFocus={this.props.autoFocus} />
<CodeMirror ref="editor" value={this.props.content.replace(re,"\n")} onChange={this.updateContent.bind(this)} options={options} autoFocus={this.props.autoFocus} disabled={this.props.disabled}/>
</div>
</div>
</div>
Expand Down
Loading

0 comments on commit ffba4f1

Please sign in to comment.