Added global headers, queries and more control app creator

This commit is contained in:
frikky
2021-05-24 19:26:11 +02:00
parent 08e159d4c2
commit fe7e0910d2
3 changed files with 91 additions and 47 deletions
+74 -30
View File
@@ -3,8 +3,7 @@ import { makeStyles } from '@material-ui/styles';
import {BrowserView, MobileView} from "react-device-detect";
import {Paper, Typography, FormControlLabel, Button, Divider, Select, MenuItem, FormControl, Switch, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Tooltip, Breadcrumbs, CircularProgress, Chip} from '@material-ui/core';
import {Add as AddIcon, CheckCircle as CheckCircleIcon, AttachFile as AttachFileIcon, Apps as AppsIcon, ErrorOutline as ErrorOutlineIcon} from '@material-ui/icons';
import {FileCopy as FileCopyIcon, Delete as DeleteIcon, Remove as RemoveIcon, Add as AddIcon, CheckCircle as CheckCircleIcon, AttachFile as AttachFileIcon, Apps as AppsIcon, ErrorOutline as ErrorOutlineIcon} from '@material-ui/icons';
import {Link} from 'react-router-dom';
import YAML from 'yaml'
@@ -198,7 +197,8 @@ const AppCreator = (props) => {
const increaseAmount = 50
const actionNonBodyRequest = ["GET", "HEAD", "DELETE", "CONNECT"]
const actionBodyRequest = ["POST", "PUT", "PATCH",]
const authenticationOptions = ["No authentication", "API key", "Bearer auth", "Basic auth", ]
//const authenticationOptions = ["No authentication", "API key", "Bearer auth", "Basic auth", "Oauth2"]
const authenticationOptions = ["No authentication", "API key", "Bearer auth", "Basic auth"]
const apikeySelection = ["Header", "Query",]
const [name, setName] = useState("");
@@ -233,9 +233,9 @@ const AppCreator = (props) => {
const defaultAuth = {
"name": "",
"type": "header",
"example": "hello",
"example": "",
}
const [extraAuth, setExtraAuth] = useState([defaultAuth])
const [extraAuth, setExtraAuth] = useState([])
//const [actions, setActions] = useState([{
// "name": "Get workflows",
@@ -898,6 +898,10 @@ const AppCreator = (props) => {
setAuthenticationOption("Basic auth")
setAuthenticationRequired(true)
break
} else if (value.scheme === "oauth2") {
setAuthenticationOption("Oauth2")
setAuthenticationRequired(true)
break
}
}
}
@@ -1256,6 +1260,26 @@ const AppCreator = (props) => {
"type": "http",
"scheme": "basic",
}
} else if (authenticationOption === "Oauth2") {
data.components.securitySchemes["Oauth2"] = {
"type": "oauth2",
"flow": {
"authorizationCode": {
},
},
}
}
if (setExtraAuth.length > 0) {
for (var key in extraAuth) {
const curauth = extraAuth[key]
data.components.securitySchemes[curauth.name] = {
"type": "apiKey",
"in": curauth.type,
"name": curauth.name,
}
}
}
fetch(globalUrl+"/api/v1/verify_openapi", {
@@ -1420,13 +1444,24 @@ const AppCreator = (props) => {
//console.log("Location: ", parameterLocation)
//console.log("Name: ", parameterName)
const extraKeys =
<div style={{marginTop: 25}}>
<div style={{marginTop: 50}}>
<Typography variant="body1">Extra headers or queries</Typography>
{extraAuth.length === 0 ?
<Button color="primary" style={{maxWidth: 50, }} variant="contained" onClick={() => {
console.log("ADD NEW!")
extraAuth.push(defaultAuth)
setExtraAuth(extraAuth)
setUpdate(Math.random())
}}>
<AddIcon style={{}}/>
</Button>
: <span style={{width: 50, }}/>}
{extraAuth.map((value, index) => {
return (
<span style={{display: "flex"}}>
<span style={{display: "flex", height: 50, marginTop: 5, }}>
<TextField
required
style={{height: 50, flex: 2, backgroundColor: inputColor, marginRight: 5, }}
style={{height: 50, flex: 2, marginTop: 0, marginBottom: 0, backgroundColor: inputColor, marginRight: 5, }}
fullWidth={true}
placeholder="Name"
id="standard-required"
@@ -1438,9 +1473,9 @@ const AppCreator = (props) => {
setExtraAuth(extraAuth)
}}
InputProps={{
//classes: {
// notchedOutline: classes.notchedOutline,
//},
classes: {
notchedOutline: classes.notchedOutline,
},
style:{
color: "white",
minHeight: 50,
@@ -1452,9 +1487,9 @@ const AppCreator = (props) => {
/>
<TextField
required
style={{height: 50, flex: 2, backgroundColor: inputColor, marginRight: 5,}}
style={{height: 50, marginTop: 0, marginBottom: 0, flex: 2, backgroundColor: inputColor, marginRight: 5,}}
fullWidth={true}
placeholder="Field Name (not token)"
placeholder="Example - input an example for the user"
type="name"
id="standard-required"
margin="normal"
@@ -1477,9 +1512,8 @@ const AppCreator = (props) => {
<Select
fullWidth
onChange={(e) => {
//console.log(e.target.value)
//setParameterLocation(e.target.value)
extraAuth[index].type = e.target.value
setUpdate(Math.random())
setExtraAuth(extraAuth)
}}
value={extraAuth[index].type}
@@ -1496,21 +1530,39 @@ const AppCreator = (props) => {
Query
</MenuItem>
</Select>
{index === extraAuth.length-1 ?
<Button color="primary" style={{maxWidth: 50, }} variant="contained" onClick={() => {
console.log("ADD NEW!")
<div style={{display: "flex", width: 100, }}>
{index === extraAuth.length-1 ?
<Button color="primary" style={{}} variant="outlined" onClick={() => {
extraAuth.push(defaultAuth)
setExtraAuth(extraAuth)
setUpdate(Math.random())
}}>
<AddIcon style={{}}/>
</Button>
: <span style={{width: 50, }}/>}
: <span style={{}}/>}
<Button color="primary" style={{}} variant="outlined" onClick={() => {
const tmpAuth = extraAuth.filter(item => item.type === value.type && item.name !== value.name)
setExtraAuth(tmpAuth)
console.log(tmpAuth)
setUpdate(Math.random())
}}>
<RemoveIcon style={{}}/>
</Button>
</div>
</span>
)
})}
</div>
const oauth2Auth = authenticationOption === "Oauth2" ?
<div style={{color: "white", marginTop: 20, }}>
<Typography variant="body1">Oauth2 authentication</Typography>
<Typography variant="body2" color="textSecondary">
Add the URL to redirect to
</Typography>
</div>
: null
const apiKey = authenticationOption === "API key" ?
<div style={{color: "white", marginTop: 20, }}>
<Typography variant="body1">API key authentication</Typography>
@@ -1682,12 +1734,12 @@ const AppCreator = (props) => {
<div style={{color: "#f85a3e", cursor: "pointer", marginRight: 15, }} onClick={() => {
duplicateAction(index)
}}>
Duplicate
<FileCopyIcon color="secondary"/>
</div>
</Tooltip>
<Tooltip title="Delete action" placement="bottom" style={{minWidth: 60}} >
<div style={{color: "#f85a3e", cursor: "pointer"}} onClick={() => {deleteAction(index)}}>
Delete
<DeleteIcon color="secondary"/>
</div>
</Tooltip>
</Paper>
@@ -1777,9 +1829,6 @@ const AppCreator = (props) => {
</span>}
key={currentAction}
InputProps={{
classes: {
notchedOutline: classes.notchedOutline,
},
style:{
color: "white",
},
@@ -2015,9 +2064,6 @@ const AppCreator = (props) => {
defaultValue={currentAction["description"]}
onChange={e => setActionField("description", e.target.value)}
InputProps={{
classes: {
notchedOutline: classes.notchedOutline,
},
style:{
color: "white",
},
@@ -2220,9 +2266,6 @@ const AppCreator = (props) => {
onChange={e => setActionField("headers", e.target.value)}
helperText={<span style={{color:"white", marginBottom: "2px",}}>Headers that are part of the request. Default: EMPTY</span>}
InputProps={{
classes: {
notchedOutline: classes.notchedOutline,
},
style:{
color: "white",
},
@@ -2726,6 +2769,7 @@ const AppCreator = (props) => {
{basicAuth}
{bearerAuth}
{apiKey}
{oauth2Auth}
{extraKeys}
{/*authenticationOption === "No authentication" ? null :
+1 -1
View File
@@ -1,5 +1,5 @@
NAME=shuffle-worker
VERSION=0.8.90
VERSION=0.8.92
echo "Running docker build with $NAME:$VERSION"
#CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o worker.bin .
+16 -16
View File
@@ -974,31 +974,31 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) {
err = deployApp(dockercli, images[0], identifier, env, workflowExecution)
if err != nil && !strings.Contains(err.Error(), "Conflict. The container name") {
if strings.Contains(err.Error(), "exited prematurely") {
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
image = images[2]
err = deployApp(dockercli, image, identifier, env, workflowExecution)
if err != nil && !strings.Contains(err.Error(), "Conflict. The container name") {
if strings.Contains(err.Error(), "exited prematurely") {
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
log.Printf("[WARNING] Failed CLEANUP execution. Downloading image remotely.")
reader, err := dockercli.ImagePull(context.Background(), image, pullOptions)
if err != nil {
log.Printf("[ERROR] Failed getting %s. Couldn't be find locally, AND is missing.", image)
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
buildBuf := new(strings.Builder)
_, err = io.Copy(buildBuf, reader)
if err != nil && !strings.Contains(fmt.Sprintf("Docker error: %s", err.Error()), "Conflict. The container name") {
if err != nil && !strings.Contains(fmt.Sprintf("%s", err.Error()), "Conflict. The container name") {
log.Printf("[ERROR] Error in IO copy: %s", err)
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
} else {
if strings.Contains(buildBuf.String(), "errorDetail") {
log.Printf("[ERROR] Docker build:\n%s\nERROR ABOVE: Trying to pull tags from: %s", buildBuf.String(), image)
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
log.Printf("[INFO] Successfully downloaded %s", image)
@@ -1009,13 +1009,13 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) {
log.Printf("[ERROR] Failed deploying image for the FOURTH time. Aborting if the image doesn't exist")
if strings.Contains(err.Error(), "exited prematurely") {
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
if strings.Contains(err.Error(), "No such image") {
//log.Printf("[WARNING] Failed deploying %s from image %s: %s", identifier, image, err)
log.Printf("[ERROR] Image doesn't exist. Shutting down")
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
}
}
@@ -1025,7 +1025,7 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) {
err = deployApp(dockercli, images[0], identifier, env, workflowExecution)
if err != nil && !strings.Contains(err.Error(), "Conflict. The container name") {
if strings.Contains(err.Error(), "exited prematurely") {
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
// Trying to replace with lowercase to deploy again. This seems to work with Dockerhub well.
@@ -1034,32 +1034,32 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) {
err = deployApp(dockercli, image, identifier, env, workflowExecution)
if err != nil && !strings.Contains(err.Error(), "Conflict. The container name") {
if strings.Contains(err.Error(), "exited prematurely") {
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
image = images[2]
err = deployApp(dockercli, image, identifier, env, workflowExecution)
if err != nil && !strings.Contains(err.Error(), "Conflict. The container name") {
if strings.Contains(err.Error(), "exited prematurely") {
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
log.Printf("[WARNING] Failed deploying image THREE TIMES. Attempting to download the latter as last resort.")
reader, err := dockercli.ImagePull(context.Background(), image, pullOptions)
if err != nil && !strings.Contains(err.Error(), "Conflict. The container name") {
log.Printf("[ERROR] Failed getting %s. The couldn't be find locally, AND is missing.", image)
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
buildBuf := new(strings.Builder)
_, err = io.Copy(buildBuf, reader)
if err != nil {
log.Printf("[ERROR] Error in IO copy: %s", err)
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
} else {
if strings.Contains(buildBuf.String(), "errorDetail") {
log.Printf("[ERROR] Docker build:\n%s\nERROR ABOVE: Trying to pull tags from: %s", buildBuf.String(), image)
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
log.Printf("[INFO] Successfully downloaded %s", image)
@@ -1069,13 +1069,13 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) {
if err != nil && !strings.Contains(err.Error(), "Conflict. The container name") {
log.Printf("[ERROR] Failed deploying image for the FOURTH time. Aborting if the image doesn't exist")
if strings.Contains(err.Error(), "exited prematurely") {
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
if strings.Contains(err.Error(), "No such image") {
//log.Printf("[WARNING] Failed deploying %s from image %s: %s", identifier, image, err)
log.Printf("[ERROR] Image doesn't exist. Shutting down")
shutdown(workflowExecution, action.ID, fmt.Sprintf("Docker error: %s", err.Error()), true)
shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true)
}
}
}