diff --git a/frontend/src/views/AppCreator.jsx b/frontend/src/views/AppCreator.jsx index 26e7c3ba..873ec947 100644 --- a/frontend/src/views/AppCreator.jsx +++ b/frontend/src/views/AppCreator.jsx @@ -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 = -
+
+ Extra headers or queries + {extraAuth.length === 0 ? + + : } {extraAuth.map((value, index) => { return ( - + { setExtraAuth(extraAuth) }} InputProps={{ - //classes: { - // notchedOutline: classes.notchedOutline, - //}, + classes: { + notchedOutline: classes.notchedOutline, + }, style:{ color: "white", minHeight: 50, @@ -1452,9 +1487,9 @@ const AppCreator = (props) => { /> { - {index === extraAuth.length-1 ? - - : } + : } + +
) })}
+ const oauth2Auth = authenticationOption === "Oauth2" ? +
+ Oauth2 authentication + + Add the URL to redirect to + +
+ : null + const apiKey = authenticationOption === "API key" ?
API key authentication @@ -1682,12 +1734,12 @@ const AppCreator = (props) => {
{ duplicateAction(index) }}> - Duplicate +
{deleteAction(index)}}> - Delete +
@@ -1777,9 +1829,6 @@ const AppCreator = (props) => { } 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={Headers that are part of the request. Default: EMPTY} InputProps={{ - classes: { - notchedOutline: classes.notchedOutline, - }, style:{ color: "white", }, @@ -2726,6 +2769,7 @@ const AppCreator = (props) => { {basicAuth} {bearerAuth} {apiKey} + {oauth2Auth} {extraKeys} {/*authenticationOption === "No authentication" ? null : diff --git a/functions/onprem/worker/build.sh b/functions/onprem/worker/build.sh index a0c83665..d3c6b70a 100644 --- a/functions/onprem/worker/build.sh +++ b/functions/onprem/worker/build.sh @@ -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 . diff --git a/functions/onprem/worker/worker.go b/functions/onprem/worker/worker.go index e5b79140..84b4c578 100644 --- a/functions/onprem/worker/worker.go +++ b/functions/onprem/worker/worker.go @@ -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) } } }