diff --git a/.env b/.env index 3413f275..11e0f712 100644 --- a/.env +++ b/.env @@ -46,8 +46,9 @@ SHUFFLE_BASE_IMAGE_TAG_SUFFIX="-0.8.60" # Used for auto-cleanup of containers. REALLY important at scale. SHUFFLE_CONTAINER_AUTO_CLEANUP=false +SHUFFLE_ELASTIC=true -SHUFFLE_OPENSEARCH_URL="http://shuffle-opensearch:9200" +SHUFFLE_OPENSEARCH_URL=http://shuffle-opensearch:9200 SHUFFLE_OPENSEARCH_USERNAME="" SHUFFLE_OPENSEARCH_PASSWORD="" -SHUFFLE_ELASTIC="true" +SHUFFLE_OPENSEARCH_CERTIFICATE_FILE="" diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index 74d4f4f7..cfc22946 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -2,7 +2,7 @@ module shuffle go 1.13 -//replace github.com/frikky/shuffle-shared => ../../../../git/shuffle-shared +replace github.com/frikky/shuffle-shared => ../../../../git/shuffle-shared //replace github.com/frikky/kin-openapi => ../../../../git/kin-openapi @@ -24,7 +24,7 @@ require ( github.com/elastic/go-elasticsearch/v7 v7.12.0 // indirect github.com/elastic/go-elasticsearch/v8 v8.0.0-20210519083322-55daf7425ecb // indirect github.com/frikky/kin-openapi v0.39.0 - github.com/frikky/shuffle-shared v0.0.50 + github.com/frikky/shuffle-shared v0.0.51 github.com/fsouza/go-dockerclient v1.7.2 // indirect github.com/ghodss/yaml v1.0.0 github.com/go-git/go-billy/v5 v5.0.0 diff --git a/backend/go-app/go.sum b/backend/go-app/go.sum index 759c5d66..1a88952a 100644 --- a/backend/go-app/go.sum +++ b/backend/go-app/go.sum @@ -159,6 +159,8 @@ github.com/frikky/shuffle-shared v0.0.49 h1:fChF0Nh/bMuXZg67Pt9XXn9+mH4IlKgB3dAz github.com/frikky/shuffle-shared v0.0.49/go.mod h1:BknTfpun3qte5bumR3OqQHf9XWPIsyj8woiXCjIlbBc= github.com/frikky/shuffle-shared v0.0.50 h1:dQIXf4mwUHuEVsXiMtZaSznz6vWt+C0KjyTAsAgMs3s= github.com/frikky/shuffle-shared v0.0.50/go.mod h1:BknTfpun3qte5bumR3OqQHf9XWPIsyj8woiXCjIlbBc= +github.com/frikky/shuffle-shared v0.0.51 h1:JrCGoRNj/LkAvSlkyx7tLv7ToNtJDIAqKqiA/poO+G4= +github.com/frikky/shuffle-shared v0.0.51/go.mod h1:BknTfpun3qte5bumR3OqQHf9XWPIsyj8woiXCjIlbBc= github.com/fsouza/go-dockerclient v1.7.2 h1:bBEAcqLTkpq205jooP5RVroUKiVEWgGecHyeZc4OFjo= github.com/fsouza/go-dockerclient v1.7.2/go.mod h1:+ugtMCVRwnPfY7d8/baCzZ3uwB0BrG5DB8OzbtxaRz8= github.com/getkin/kin-openapi v0.8.0 h1:a6TQjTqwkyscC4/hShJX7WhCVE+4bi9lzw61XHQW5hE= diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 72fa2ae8..e315afbd 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -15,6 +15,7 @@ import ( "errors" "path/filepath" + "crypto/tls" "fmt" "io" "io/ioutil" @@ -4240,7 +4241,7 @@ func runInitEs(ctx context.Context) { cloneOptions.ReferenceName = plumbing.ReferenceName(branch) } - log.Printf("Getting apps from %s", url) + log.Printf("[DEBUG] Getting apps from %s", url) r, err := git.Clone(storer, fs, cloneOptions) @@ -5649,7 +5650,7 @@ func initHandlers() { //requestCache = cache.New(5*time.Minute, 10*time.Minute) dbclient, err = datastore.NewClient(ctx, gceProject, option.WithGRPCDialOption(grpc.WithNoProxy())) if err != nil { - panic(fmt.Sprintf("[DEBUG] Database client error during init: %s", err)) + log.Fatalf("[DEBUG] Database client error during init: %s", err) } esUrl := os.Getenv("SHUFFLE_OPENSEARCH_URL") @@ -5657,15 +5658,33 @@ func initHandlers() { esUrl = "http://shuffle-opensearch:9200" } - es, err := elasticsearch.NewClient( - elasticsearch.Config{ - Addresses: []string{esUrl}, - Username: os.Getenv("SHUFFLE_OPENSEARCH_USERNAME"), - Password: os.Getenv("SHUFFLE_OPENSEARCH_PASSWORD"), + config := elasticsearch.Config{ + Addresses: []string{esUrl}, + Username: os.Getenv("SHUFFLE_OPENSEARCH_USERNAME"), + Password: os.Getenv("SHUFFLE_OPENSEARCH_PASSWORD"), + Transport: &http.Transport{ + MaxIdleConnsPerHost: 100, + ResponseHeaderTimeout: time.Second, + TLSClientConfig: &tls.Config{ + MinVersion: tls.VersionTLS11, + }, }, - ) + } + + certificateLocation := os.Getenv("SHUFFLE_OPENSEARCH_CERTIFICATE_FILE") + if len(certificateLocation) > 0 { + cert, err := ioutil.ReadFile(certificateLocation) + if err != nil { + log.Fatalf("[WARNING] Failed configuring certificates: %s not found", err) + } else { + config.CACert = cert + } + log.Printf("[INFO] Added certificate %#v elastic client.", certificateLocation) + } + + es, err := elasticsearch.NewClient(config) if err != nil { - panic(fmt.Sprintf("[DEBUG] Database client for ELASTICSEARCH error during init: %s", err)) + log.Fatalf("[DEBUG] Database client for ELASTICSEARCH error during init (fatal): %s", err) } elasticConfig := "elasticsearch" diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index c3adae0e..e03ed4df 100644 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -3421,7 +3421,7 @@ func iterateOpenApiGithub(fs billy.Filesystem, dir []os.FileInfo, extra string, //log.Printf("%s", string(readFile)) swagger, err := openapi3.NewSwaggerLoader().LoadSwaggerFromData([]byte(parsedOpenApi.Body)) if err != nil { - log.Printf("Swagger validation error in loop (%s): %s", filename, err) + log.Printf("[WARNING] Swagger validation error in loop (%s): %s. Continuing.", filename, err) continue } @@ -3432,7 +3432,7 @@ func iterateOpenApiGithub(fs billy.Filesystem, dir []os.FileInfo, extra string, //log.Printf("Should generate yaml") swagger, api, _, err := shuffle.GenerateYaml(swagger, parsedOpenApi.ID) if err != nil { - log.Printf("Failed building and generating yaml in loop (%s): %s", filename, err) + log.Printf("Failed building and generating yaml in loop (2) (%s): %s. Continuing.", filename, err) continue } diff --git a/docker-compose.yml b/docker-compose.yml index 9fcdbcf5..bae6d5bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,7 @@ services: - backend backend: #build: ./backend - image: ghcr.io/frikky/shuffle-backend:0.8.93 + image: ghcr.io/frikky/shuffle-backend:0.8.95 container_name: shuffle-backend hostname: ${BACKEND_HOSTNAME} # Here for debugging: @@ -29,9 +29,10 @@ services: - /var/run/docker.sock:/var/run/docker.sock - ${SHUFFLE_APP_HOTLOAD_LOCATION}:/shuffle-apps - ${SHUFFLE_FILE_LOCATION}:/shuffle-files + #- ${SHUFFLE_OPENSEARCH_CERTIFICATE_FILE}:/shuffle-files/es_certificate environment: - DATASTORE_EMULATOR_HOST=shuffle-database:8000 - - SHUFFLE_OPENSEARCH_URL=http://shuffle-opensearch:9200 + #- SHUFFLE_OPENSEARCH_URL=${SHUFFLE_OPENSEARCH_URL} - SHUFFLE_APP_HOTLOAD_FOLDER=/shuffle-apps - SHUFFLE_FILE_LOCATION=/shuffle-files - ORG_ID=${ORG_ID} diff --git a/frontend/src/components/ParsedAction.jsx b/frontend/src/components/ParsedAction.jsx index be5588cc..ba331a27 100644 --- a/frontend/src/components/ParsedAction.jsx +++ b/frontend/src/components/ParsedAction.jsx @@ -6,6 +6,7 @@ import { GetIconInfo } from "../views/Workflows.jsx"; import { sortByKey } from "../views/AngularWorkflow.jsx"; import { useTheme } from '@material-ui/core/styles'; import NestedMenuItem from "material-ui-nested-menu-item"; +//import NestedMenuItem from "./NestedMenu.jsx"; import {Popper, TextField, Drawer, Button, Paper, Grid, Tabs, InputAdornment, Tab, ButtonBase, Tooltip, Select, MenuItem, Divider, Dialog, Modal, DialogActions, DialogTitle, InputLabel, DialogContent, FormControl, IconButton, Menu, Input, FormGroup, FormControlLabel, Typography, Checkbox, Breadcrumbs, CircularProgress, Switch, Fade} from '@material-ui/core'; import {GetApp as GetAppIcon, Search as SearchIcon, ArrowUpward as ArrowUpwardIcon, Visibility as VisibilityIcon, Done as DoneIcon, Close as CloseIcon, Error as ErrorIcon, FindReplace as FindreplaceIcon, ArrowLeft as ArrowLeftIcon, Cached as CachedIcon, DirectionsRun as DirectionsRunIcon, Add as AddIcon, Polymer as PolymerIcon, FormatListNumbered as FormatListNumberedIcon, Create as CreateIcon, PlayArrow as PlayArrowIcon, AspectRatio as AspectRatioIcon, MoreVert as MoreVertIcon, Apps as AppsIcon, Schedule as ScheduleIcon, FavoriteBorder as FavoriteBorderIcon, Pause as PauseIcon, Delete as DeleteIcon, AddCircleOutline as AddCircleOutlineIcon, Save as SaveIcon, KeyboardArrowLeft as KeyboardArrowLeftIcon, KeyboardArrowRight as KeyboardArrowRightIcon, ArrowBack as ArrowBackIcon, Settings as SettingsIcon, LockOpen as LockOpenIcon, ExpandMore as ExpandMoreIcon, VpnKey as VpnKeyIcon} from '@material-ui/icons'; @@ -921,6 +922,7 @@ const ParsedAction = (props) => { border: `2px solid #f85a3e`, color: "white", marginTop: 2, + maxHeight: 400, }} > {actionlist.map(innerdata => { @@ -970,11 +972,11 @@ const ParsedAction = (props) => { const handleMouseover = () => { if (innerdata.type === "Execution Argument") { - handleExecArgumentHover(true) - } else if (innerdata.type === "action") { - handleActionHover(true, innerdata.id) - } - } + handleExecArgumentHover(true) + } else if (innerdata.type === "action") { + handleActionHover(true, innerdata.id) + } + } const handleMouseOut = () => { if (innerdata.type === "Execution Argument") { @@ -999,8 +1001,15 @@ const ParsedAction = (props) => { } parentMenuOpen={!!menuPosition} - style={{backgroundColor: theme.palette.inputColor, color: "white", minWidth: 250,}} + style={{backgroundColor: theme.palette.inputColor, color: "white", minWidth: 250, maxWidth: 250, maxHeight: 400, scrollX: "", }} + //PaperProps={{ + // style: { + // maxHeight: 400, + // width: 250, + // } + //}} onClick={() => { + console.log("CLICKED: ", innerdata) handleItemClick([innerdata]) }} > @@ -1008,7 +1017,7 @@ const ParsedAction = (props) => { // FIXME: Should be recursive in here const icon = pathdata.type === "value" ? : pathdata.type === "list" ? : return ( - {}} + {console.log("HOVER: ", pathdata)}} onClick={() => { handleItemClick([innerdata, pathdata]) }} @@ -1024,7 +1033,7 @@ const ParsedAction = (props) => { })} : - handleMouseover()} onMouseOut={() => {handleMouseOut()}} + handleMouseover()} onMouseOut={() => {handleMouseOut()}} onClick={() => { handleItemClick([innerdata]) }} diff --git a/frontend/src/views/Admin.jsx b/frontend/src/views/Admin.jsx index e3c0f921..02b2063a 100644 --- a/frontend/src/views/Admin.jsx +++ b/frontend/src/views/Admin.jsx @@ -2700,7 +2700,7 @@ const Admin = (props) => { App Authentication/> Files /> Schedules /> - {/*isCloud ? null : Environments/>*/} + {isCloud ? null : Environments/>} {window.location.protocol == "http:" && window.location.port === "3000" ? Hybrid/> : null} {window.location.protocol == "http:" && window.location.port === "3000" ? Organizations/> : null} {window.location.protocol === "http:" && window.location.port === "3000" ? Categories/> : null} diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index f79df0e0..bc0d4f50 100644 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -2270,7 +2270,7 @@ const AngularWorkflow = (props) => { case 90: if (previouskey === 17) { console.log("CTRL+Z") - handleHistoryUndo() + //handleHistoryUndo() } break; diff --git a/frontend/src/views/Apps.jsx b/frontend/src/views/Apps.jsx index 5df39bbc..3e08a13b 100644 --- a/frontend/src/views/Apps.jsx +++ b/frontend/src/views/Apps.jsx @@ -1144,7 +1144,7 @@ const Apps = (props) => { .then((response) => { setIsLoading(false) if (response.status === 200) { - alert.success("Hotloaded apps!") + //alert.success("Hotloaded apps!") getApps() } diff --git a/frontend/src/views/SettingsPage.jsx b/frontend/src/views/SettingsPage.jsx index b1f53c1c..6a1cdd4a 100644 --- a/frontend/src/views/SettingsPage.jsx +++ b/frontend/src/views/SettingsPage.jsx @@ -29,6 +29,7 @@ const Settings = (props) => { const [userInfo, ] = useState(userdata) const [userSettings, setUserSettings] = useState({}) + const isCloud = window.location.host === "localhost:3002" || window.location.host === "shuffler.io" const bodyDivStyle = { margin: "auto", @@ -421,7 +422,7 @@ const Settings = (props) => { />