Skip to content

Commit

Permalink
flesh out controller ux (#234)
Browse files Browse the repository at this point in the history
* flesh out controller ux
use esbuild over an npm package for frontend js

* include dev mode flag

* fix test

* set default max price

fix #237
  • Loading branch information
willscott authored Jun 24, 2021
1 parent 11fff0f commit d2f56cf
Show file tree
Hide file tree
Showing 17 changed files with 440 additions and 52 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
dealbot.toml
*~
controller/static/script.js
node_modules


# Binaries for programs and plugins
*.exe
Expand Down
10 changes: 9 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# run npm install in a container with node.
FROM node:14-alpine AS js
WORKDIR /usr/src/app
COPY ./controller/app .
RUN npm install

FROM golang:alpine AS builder
RUN apk update
RUN apk upgrade
Expand All @@ -6,8 +12,10 @@ RUN apk add --update gcc>=9.3.0 g++>=9.3.0 alpine-sdk
WORKDIR /go/src/app/

COPY . .
COPY --from=js /usr/src/app ./controller/app
# Fetch dependencies.
RUN go get -d -v ./...
RUN go generate ./...
RUN go build -o dealbot -ldflags "-X github.com/filecoin-project/dealbot/controller.buildDate=`date -u +%d/%m/%Y@%H:%M:%S`" ./

FROM alpine
Expand All @@ -16,4 +24,4 @@ COPY --from=builder /go/src/app/dealbot /dealbot
ENV DEALBOT_LOG_JSON=true
ENV DEALBOT_WORKERS=10
ENV STAGE_TIMEOUT=DefaultStorage=48h,DefaultRetrieval=48h
ENTRYPOINT ["/dealbot"]
ENTRYPOINT ["/dealbot"]
4 changes: 4 additions & 0 deletions commands/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,10 @@ var ControllerFlags = []cli.Flag{
Usage: "set an access secret for access to inprogress data over gql",
EnvVars: []string{"DEALBOT_GRAPHQL_ACCESS_TOKEN"},
}),
altsrc.NewStringFlag(&cli.StringFlag{
Name: "devAssetDir",
Usage: "build frontend assets from directory instead of embedded version (set to location of 'controller'; the directory containing static and app)",
}),
}

var AllFlags = append(DealFlags, append(SingleTaskFlags, append(DaemonFlags, append(ControllerFlags, MockFlags...)...)...)...)
94 changes: 94 additions & 0 deletions controller/app/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import "./jquery-global";
import "bootstrap-cron-picker/dist/cron-picker";

$().ready(() => {
$('#newSchedule').cronPicker();

$("#addDone").hide();
if ($('#newSR').is(':checked')) {
$("#newstorage").hide();
} else {
$("#newretrieval").hide();
}
$("#newSR").on('change', () => {
if ($('#newSR').is(':checked')) {
$("#newretrieval").show();
$("#newstorage").hide();
} else {
$("#newretrieval").hide();
$("#newstorage").show();
}
})

if (!$('#newRepeat').is(':checked')) {
$("#setschedule").hide();
}
$("#newRepeat").on('change', () => {
if ($('#newRepeat').is(':checked')) {
$("#setschedule").show();
} else {
$("#setschedule").hide();
}
})

$("#addtask button").on('click', doSubmit);
$("schedulesection form").on('submit', doSubmit);
})

function doSubmit(e) {
if (e.preventDefault) {
e.preventDefault()
}

// loop over miners
let miners = $("#newMiner").val().trim().split('\n')

let remaining = miners.length;
let done = () => {
remaining--;
if (!remaining) {
$("#addDone").show()
}
}

for (let i = 0; i < miners.length; i++) {
let miner = miners[i];
let url = "/tasks/storage";
let data = {};
if ($('#newSR').is(':checked')) {
url = "/tasks/retrieval";
data = {
"Miner": miner,
"PayloadCID": $('#newCid').val(),
"CARExport": false,
"MaxPriceAttoFIL": 20000000000,
}
} else {
data = {
"Miner": miner,
"Size": $('#newSize').val(),
"StartOffset": 6152, // 3 days?
"FastRetrieval": $('#newFast').is(':checked'),
"Verified": $('#newVerified').is(':checked'),
"MaxPriceAttoFIL": 20000000000,
}
}

if ($('#newRepeat').is(':checked')) {
data.Schedule = $('#newSchedule').val()
data.ScheduleLimit = $('#newScheduleLimit').val()
}
if ($('#newScheduleTag').val() !='') {
data.Tag = $('#newScheduleTag').val()
}

$.ajax({
type: "POST",
url: url,
data: data,
success: done,
});
}

return false
}
3 changes: 3 additions & 0 deletions controller/app/jquery-global.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import jquery from 'jquery';
window.jQuery = jquery;
window.$ = jquery;
30 changes: 30 additions & 0 deletions controller/app/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions controller/app/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "dealbot-controller",
"version": "1.0.0",
"description": "dealbot controller webapp logic",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/filecoin-project/dealbot.git"
},
"author": "Protocol Labs",
"license": "MIT",
"bugs": {
"url": "https://github.com/filecoin-project/dealbot/issues"
},
"homepage": "https://github.com/filecoin-project/dealbot#readme",
"devDependencies": {
"bootstrap-cron-picker": "^1.0.0",
"jquery": "^3.6.0"
}
}
29 changes: 20 additions & 9 deletions controller/controller.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
//go:generate go run ./webutil/gen app static/script.js

package controller

import (
"context"
"embed"
"fmt"
"io"
"io/fs"
"io/ioutil"
"net"
"net/http"
"os"
"path"
"time"

"github.com/filecoin-project/dealbot/controller/graphql"
"github.com/filecoin-project/dealbot/controller/state"
"github.com/filecoin-project/dealbot/controller/webutil"
"github.com/filecoin-project/dealbot/metrics"
metricslog "github.com/filecoin-project/dealbot/metrics/log"
"github.com/filecoin-project/dealbot/metrics/prometheus"
Expand Down Expand Up @@ -101,12 +106,7 @@ func New(ctx *cli.Context) (*Controller, error) {
return nil, err
}

gqlToken := ""
if ctx.IsSet("gqlAccessToken") {
gqlToken = ctx.String("gqlAccessToken")
}

return NewWithDependencies(l, gl, gqlToken, recorder, backend)
return NewWithDependencies(ctx, l, gl, recorder, backend)
}

type logEcapsulator struct {
Expand All @@ -121,7 +121,7 @@ func (fw *logEcapsulator) Write(p []byte) (n int, err error) {
//go:embed static
var static embed.FS

func NewWithDependencies(listener, graphqlListener net.Listener, gqlToken string, recorder metrics.MetricsRecorder, backend state.State) (*Controller, error) {
func NewWithDependencies(ctx *cli.Context, listener, graphqlListener net.Listener, recorder metrics.MetricsRecorder, backend state.State) (*Controller, error) {
srv := new(Controller)
srv.db = backend

Expand Down Expand Up @@ -156,7 +156,18 @@ func NewWithDependencies(listener, graphqlListener net.Listener, gqlToken string
if metricsHandler != nil {
r.Handle("/metrics", metricsHandler)
}
r.PathPrefix("/").Handler(http.FileServer(http.FS(statDir)))

if ctx.IsSet("devAssetDir") {
scriptResolver := func(w http.ResponseWriter, r *http.Request) {
data := webutil.Compile(path.Join(ctx.String("devAssetDir"), "app"), false)
w.Header().Set("Content-Type", "application/json")
io.WriteString(w, data)
}
r.HandleFunc("/script.js", scriptResolver)
r.PathPrefix("/").Handler(http.FileServer(http.Dir(path.Join(ctx.String("devAssetDir"), "static"))))
} else {
r.PathPrefix("/").Handler(http.FileServer(http.FS(statDir)))
}

srv.doneCh = make(chan struct{})
srv.server = &http.Server{
Expand All @@ -166,7 +177,7 @@ func NewWithDependencies(listener, graphqlListener net.Listener, gqlToken string
}

if graphqlListener != nil {
gqlHandler, err := graphql.GetHandler(srv.db, gqlToken)
gqlHandler, err := graphql.GetHandler(srv.db, ctx.String("gqlAccessToken"))
if err != nil {
return nil, err
}
Expand Down
5 changes: 4 additions & 1 deletion controller/http_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
"flag"
"fmt"
"io"
"io/ioutil"
Expand All @@ -21,6 +22,7 @@ import (
"github.com/ipld/go-ipld-prime/codec/dagjson"
"github.com/libp2p/go-libp2p-core/crypto"
"github.com/stretchr/testify/require"
"github.com/urfave/cli/v2"
)

const jsonTestDeals = "../devnet/sample_tasks.json"
Expand Down Expand Up @@ -316,7 +318,8 @@ func newHarness(ctx context.Context, t *testing.T) *harness {
require.NoError(t, err)
be, err := state.NewStateDB(ctx, "sqlite", h.dbloc+"/tmp.sqlite", pr, h.recorder)
require.NoError(t, err)
h.controller, err = controller.NewWithDependencies(listener, nil, "", h.recorder, be)
cc := cli.NewContext(cli.NewApp(), &flag.FlagSet{}, nil)
h.controller, err = controller.NewWithDependencies(cc, listener, nil, h.recorder, be)

h.serveErr = make(chan error, 1)
go func() {
Expand Down
2 changes: 1 addition & 1 deletion controller/state/statedb.go
Original file line number Diff line number Diff line change
Expand Up @@ -877,7 +877,7 @@ func (s *stateDB) PublishRecordsFrom(ctx context.Context, worker string) error {
if err != nil {
return err
}
tskBuilder := tasks.Type.FinishedTask.NewBuilder()
tskBuilder := tasks.Type.FinishedTask__Repr.NewBuilder()
if err := dagjson.Decoder(tskBuilder, rcrdRdr); err != nil {
return err
}
Expand Down
Loading

0 comments on commit d2f56cf

Please sign in to comment.