Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
4
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Switch to GitLab Next
Sign in / Register
Toggle navigation
cogment
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
31
Issues
31
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
12
Merge Requests
12
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Test Cases
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cogment
cogment
Commits
d13003de
Commit
d13003de
authored
Jul 27, 2020
by
Irv Lustigman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sync cli-z
parent
c1e32ee3
Pipeline
#171410503
passed with stages
in 10 minutes and 10 seconds
Changes
37
Pipelines
4
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
908 additions
and
103 deletions
+908
-103
cli/api/logs.go
cli/api/logs.go
+1
-1
cli/api/project.go
cli/api/project.go
+2
-0
cli/cmd/init.go
cli/cmd/init.go
+180
-21
cli/cmd/init_test.go
cli/cmd/init_test.go
+43
-40
cli/cmd/logs.go
cli/cmd/logs.go
+2
-1
cli/go.sum
cli/go.sum
+0
-1
cli/helper/helper.go
cli/helper/helper.go
+5
-0
cli/templates/README.md.go
cli/templates/README.md.go
+13
-0
cli/templates/agents/Dockerfile.go
cli/templates/agents/Dockerfile.go
+6
-2
cli/templates/agents/main.py.go
cli/templates/agents/main.py.go
+4
-0
cli/templates/clients/Dockerfile.go
cli/templates/clients/Dockerfile.go
+6
-2
cli/templates/clients/main.py.go
cli/templates/clients/main.py.go
+6
-2
cli/templates/cogment.yaml.go
cli/templates/cogment.yaml.go
+42
-6
cli/templates/configs/dashboard.json.go
cli/templates/configs/dashboard.json.go
+5
-0
cli/templates/configs/dashboard.yaml.go
cli/templates/configs/dashboard.yaml.go
+5
-0
cli/templates/configs/datasource.yaml.go
cli/templates/configs/datasource.yaml.go
+5
-0
cli/templates/configs/prometheus.yaml.go
cli/templates/configs/prometheus.yaml.go
+5
-0
cli/templates/configurator/Dockerfile.go
cli/templates/configurator/Dockerfile.go
+20
-0
cli/templates/configurator/main.py.go
cli/templates/configurator/main.py.go
+60
-0
cli/templates/data.proto.go
cli/templates/data.proto.go
+8
-1
cli/templates/docker-compose-override.yaml.go
cli/templates/docker-compose-override.yaml.go
+45
-0
cli/templates/docker-compose.yaml.go
cli/templates/docker-compose.yaml.go
+127
-4
cli/templates/envoy/envoy.yaml.go
cli/templates/envoy/envoy.yaml.go
+50
-0
cli/templates/envs/Dockerfile.go
cli/templates/envs/Dockerfile.go
+6
-2
cli/templates/envs/main.py.go
cli/templates/envs/main.py.go
+4
-0
cli/templates/gitignore.go
cli/templates/gitignore.go
+7
-0
cli/templates/js_clients/Dockerfile.go
cli/templates/js_clients/Dockerfile.go
+16
-0
cli/templates/js_clients/index.html.go
cli/templates/js_clients/index.html.go
+15
-0
cli/templates/js_clients/main.js.go
cli/templates/js_clients/main.js.go
+53
-0
cli/templates/js_clients/package.json.go
cli/templates/js_clients/package.json.go
+28
-0
cli/templates/js_clients/webpack.config.js.go
cli/templates/js_clients/webpack.config.js.go
+21
-0
cli/templates/orchestrator/Dockerfile.go
cli/templates/orchestrator/Dockerfile.go
+1
-1
cli/templates/replaybuffer/Dockerfile.go
cli/templates/replaybuffer/Dockerfile.go
+25
-0
cli/templates/replaybuffer/replaybuffer.py.go
cli/templates/replaybuffer/replaybuffer.py.go
+73
-0
cli/templates/revisioning/cogment.sh.go
cli/templates/revisioning/cogment.sh.go
+6
-0
cli/templates/revisioning/requirements.txt.go
cli/templates/revisioning/requirements.txt.go
+5
-0
cli/testdata/cog_settings.py
cli/testdata/cog_settings.py
+8
-19
No files found.
cli/api/logs.go
View file @
d13003de
...
...
@@ -9,6 +9,6 @@ type SearchLogsResult struct {
type
LogEntry
struct
{
ServiceName
string
`json:"service_name"`
Message
string
`json:"message"`
Timestamp
uint64
`json:"timestamp"`
Timestamp
uint64
`json:"timestamp"`
Source
string
`json:"source"`
}
cli/api/project.go
View file @
d13003de
...
...
@@ -7,6 +7,8 @@ type ProjectConfig struct {
Environment
*
Environment
ActorClasses
[]
*
ActorClass
`yaml:"actor_classes"`
TrialParams
*
TrialParams
`yaml:"trial_params"`
ProjectName
string
CliVersion
string
}
type
Environment
struct
{
...
...
cli/cmd/init.go
View file @
d13003de
...
...
@@ -27,6 +27,13 @@ import (
"gitlab.com/cogment/cogment/templates/clients"
"gitlab.com/cogment/cogment/templates/envs"
"gitlab.com/cogment/cogment/templates/orchestrator"
"gitlab.com/cogment/cogment/templates/envoy"
"gitlab.com/cogment/cogment/templates/js_clients"
"gitlab.com/cogment/cogment/templates/configs"
"gitlab.com/cogment/cogment/templates/replaybuffer"
"gitlab.com/cogment/cogment/templates/revisioning"
"gitlab.com/cogment/cogment/templates/configurator"
"gitlab.com/cogment/cogment/version"
"html/template"
"io"
"log"
...
...
@@ -66,6 +73,10 @@ var initCmd = &cobra.Command{
log
.
Fatalln
(
err
)
}
projectname
:=
strings
.
Split
(
dst
,
"/"
)
config
.
ProjectName
=
projectname
[
len
(
projectname
)
-
1
]
config
.
CliVersion
=
version
.
CliVersion
err
=
createProjectFiles
(
dst
,
config
)
if
err
!=
nil
{
log
.
Fatalln
(
err
)
...
...
@@ -83,6 +94,10 @@ func createProjectFiles(dst string, config *api.ProjectConfig) error {
return
err
}
if
err
:=
generateFromTemplate
(
templates
.
ROOT_DOCKER_COMPOSE_OVERRIDE
,
dst
+
"/docker-compose.override.template.yaml"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
templates
.
ROOT_DATA_PROTO
,
dst
+
"/data.proto"
,
config
);
err
!=
nil
{
return
err
}
...
...
@@ -115,6 +130,71 @@ func createProjectFiles(dst string, config *api.ProjectConfig) error {
return
err
}
if
err
:=
generateFromTemplate
(
envoy
.
ENVOY_YAML
,
dst
+
"/envoy/envoy.yaml"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
js_clients
.
MAIN_JS
,
dst
+
"/clients/js/main.js"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
js_clients
.
INDEX_HTML
,
dst
+
"/clients/js/index.html"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
js_clients
.
PACKAGE_JSON
,
dst
+
"/clients/js/package.json"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
js_clients
.
WEBPACK_CONFIG_JS
,
dst
+
"/clients/js/webpack.config.js"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
js_clients
.
DOCKERFILE
,
dst
+
"/clients/js/Dockerfile"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
configs
.
PROMETHEUS_YAML
,
dst
+
"/configs/prometheus/prometheus.yaml"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
configs
.
GRAFANA_DASHBOARD_JSON
,
dst
+
"/configs/grafana/dashboards/dashboard.json"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
configs
.
GRAFANA_DASHBOARD_YAML
,
dst
+
"/configs/grafana/dashboards/dashboard.yaml"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
configs
.
GRAFANA_DATASOURCE_YAML
,
dst
+
"/configs/grafana/datasources/datasource.yaml"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
replaybuffer
.
DOCKERFILE
,
dst
+
"/replaybuffer/Dockerfile"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
replaybuffer
.
REPLAYBUFFER_PY
,
dst
+
"/replaybuffer/replaybuffer.py"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
revisioning
.
REQUIREMENTS_TXT
,
dst
+
"/requirements.txt"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
revisioning
.
COGMENT_SH
,
dst
+
"/cogment.sh"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
configurator
.
DOCKERFILE
,
dst
+
"/configurator/Dockerfile"
,
config
);
err
!=
nil
{
return
err
}
if
err
:=
generateFromTemplate
(
configurator
.
CONFIGURATOR_PY
,
dst
+
"/configurator/main.py"
,
config
);
err
!=
nil
{
return
err
}
for
k
,
actor
:=
range
config
.
ActorClasses
{
countAi
,
_
:=
config
.
CountActorsByActorClass
(
config
.
ActorClasses
[
k
]
.
Id
)
if
countAi
<
1
{
...
...
@@ -150,6 +230,7 @@ func generateFromTemplate(tplStr, dst string, config interface{}) error {
"snakeify"
:
helper
.
Snakeify
,
"kebabify"
:
helper
.
Kebabify
,
"pascalify"
:
helper
.
Pascalify
,
"tocaps"
:
helper
.
Tocaps
,
})
t
=
template
.
Must
(
t
.
Parse
(
tplStr
))
...
...
@@ -179,58 +260,64 @@ func createProjectConfigFromReader(stdin io.Reader) (*api.ProjectConfig, error)
config
:=
api
.
ProjectConfig
{
TrialParams
:
&
api
.
TrialParams
{}}
nbActors
,
err
:=
getTotalActorsFromReader
(
reader
)
name
,
err
:=
getClientNameFromReader
(
reader
)
if
err
!=
nil
{
return
nil
,
err
}
actorClass
:=
api
.
ActorClass
{
Id
:
name
}
config
.
ActorClasses
=
append
(
config
.
ActorClasses
,
&
actorClass
)
actor
:=
api
.
Actor
{
ActorClass
:
name
,
Endpoint
:
"human"
,
}
config
.
TrialParams
.
Actors
=
append
(
config
.
TrialParams
.
Actors
,
&
actor
)
nbAgentActors
,
err
:=
getTotalAgentsFromReader
(
reader
)
if
err
!=
nil
{
return
nil
,
err
}
totalHuman
:=
0
for
len
(
config
.
ActorClasses
)
<
nbActors
{
for
i
:=
0
;
i
<
nbAgentActors
;
i
++
{
name
,
err
:=
getA
ctorClassNameFromReader
(
reader
)
name
,
err
:=
getA
gentClassNameFromReader
(
reader
,
i
)
for
_
,
val
:=
range
config
.
ActorClasses
{
if
name
==
val
.
Id
{
err
=
fmt
.
Errorf
(
"this name is already taken"
)
}
}
if
err
!=
nil
{
fmt
.
Println
(
err
)
continue
return
nil
,
err
}
nbAi
,
nbHuman
:=
getActorClassFromReader
(
reader
,
name
)
actorClass
:=
api
.
ActorClass
{
Id
:
name
}
for
i
:=
0
;
i
<
nbAi
;
i
++
{
actor
:=
api
.
Actor
{
ActorClass
:
name
,
Endpoint
:
"grpc://"
+
helper
.
Kebabify
(
name
)
+
":9000"
,
}
config
.
ActorClasses
=
append
(
config
.
ActorClasses
,
&
actorClass
)
config
.
TrialParams
.
Actors
=
append
(
config
.
TrialParams
.
Actors
,
&
actor
)
nbAgentInstances
,
err
:=
getAgentInstantsFromReader
(
reader
,
name
)
if
err
!=
nil
{
return
nil
,
err
}
for
i
:=
0
;
i
<
nbHuman
;
i
++
{
for
j
:=
0
;
j
<
nbAgentInstances
;
j
++
{
actor
:=
api
.
Actor
{
ActorClass
:
name
,
Endpoint
:
"
human
"
,
Endpoint
:
"
grpc://"
+
helper
.
Kebabify
(
name
)
+
":9000
"
,
}
config
.
TrialParams
.
Actors
=
append
(
config
.
TrialParams
.
Actors
,
&
actor
)
}
if
totalHuman
+
nbHuman
>
1
{
fmt
.
Println
(
"cogment doesn't support more than 1 human now"
)
continue
}
totalHuman
+=
nbHuman
config
.
ActorClasses
=
append
(
config
.
ActorClasses
,
&
actorClass
)
}
return
&
config
,
nil
}
func
getActorClassFromReader
(
reader
*
bufio
.
Reader
,
name
string
)
(
totalAi
,
totalHuman
int
)
{
for
{
...
...
@@ -296,6 +383,78 @@ func getActorClassNameFromReader(reader *bufio.Reader) (string, error) {
return
input
,
nil
}
func
getClientNameFromReader
(
reader
*
bufio
.
Reader
)
(
string
,
error
)
{
fmt
.
Printf
(
"Master client actor name: "
)
input
,
_
:=
reader
.
ReadString
(
'\n'
)
input
=
strings
.
TrimSpace
(
input
)
if
input
==
""
{
return
input
,
fmt
.
Errorf
(
"name can't be empty"
)
}
if
input
!=
strings
.
ToLower
(
input
)
{
return
input
,
fmt
.
Errorf
(
"no upper case letters"
)
}
if
strings
.
Contains
(
input
,
"-"
)
{
return
input
,
fmt
.
Errorf
(
"no dashes/hyphens"
)
}
if
strings
.
Contains
(
"0123456789"
,
input
[
0
:
1
])
{
return
input
,
fmt
.
Errorf
(
"name can't start with numeric"
)
}
return
input
,
nil
}
func
getAgentClassNameFromReader
(
reader
*
bufio
.
Reader
,
agent_number
int
)
(
string
,
error
)
{
fmt
.
Printf
(
"Agent actor type "
+
strconv
.
Itoa
(
agent_number
+
1
)
+
" name: "
)
input
,
_
:=
reader
.
ReadString
(
'\n'
)
input
=
strings
.
TrimSpace
(
input
)
if
input
==
""
{
return
input
,
fmt
.
Errorf
(
"name can't be empty"
)
}
if
input
!=
strings
.
ToLower
(
input
)
{
return
input
,
fmt
.
Errorf
(
"no upper case letters"
)
}
if
strings
.
Contains
(
input
,
"-"
)
{
return
input
,
fmt
.
Errorf
(
"no dashed/hyphens"
)
}
if
strings
.
Contains
(
"0123456789"
,
input
[
0
:
1
])
{
return
input
,
fmt
.
Errorf
(
"name can't start with numeric"
)
}
return
input
,
nil
}
func
getTotalAgentsFromReader
(
reader
*
bufio
.
Reader
)
(
int
,
error
)
{
for
{
fmt
.
Print
(
"Number of agent actor types: "
)
result
,
err
:=
getIntegerFromReader
(
reader
)
if
err
==
nil
&&
result
>
0
{
return
result
,
nil
}
fmt
.
Println
(
"this value must be an integer greater than 0"
)
}
}
func
getAgentInstantsFromReader
(
reader
*
bufio
.
Reader
,
agent_name
string
)
(
int
,
error
)
{
for
{
fmt
.
Print
(
"Number of agent '"
+
agent_name
+
"' instances: "
)
result
,
err
:=
getIntegerFromReader
(
reader
)
if
err
==
nil
&&
result
>
0
{
return
result
,
nil
}
fmt
.
Println
(
"this value must be an integer greater than 0"
)
}
}
func
init
()
{
rootCmd
.
AddCommand
(
initCmd
)
}
cli/cmd/init_test.go
View file @
d13003de
...
...
@@ -14,14 +14,15 @@ import (
var
expectedConfig
=
api
.
ProjectConfig
{
ActorClasses
:
[]
*
api
.
ActorClass
{
&
api
.
ActorClass
{
Id
:
"player red"
},
&
api
.
ActorClass
{
Id
:
"player white"
},
&
api
.
ActorClass
{
Id
:
"master"
},
&
api
.
ActorClass
{
Id
:
"smart"
},
&
api
.
ActorClass
{
Id
:
"dumb"
},
},
TrialParams
:
&
api
.
TrialParams
{
Actors
:
[]
*
api
.
Actor
{
&
api
.
Actor
{
ActorClass
:
"
player red"
,
Endpoint
:
"grpc://player-red:9000
"
},
&
api
.
Actor
{
ActorClass
:
"
player red"
,
Endpoint
:
"human
"
},
&
api
.
Actor
{
ActorClass
:
"
player white"
,
Endpoint
:
"grpc://player-white
:9000"
},
&
api
.
Actor
{
ActorClass
:
"
master"
,
Endpoint
:
"human
"
},
&
api
.
Actor
{
ActorClass
:
"
smart"
,
Endpoint
:
"grpc://smart:9000
"
},
&
api
.
Actor
{
ActorClass
:
"
dumb"
,
Endpoint
:
"grpc://dumb
:9000"
},
},
},
}
...
...
@@ -29,13 +30,12 @@ var expectedConfig = api.ProjectConfig{
func
TestCreateProjectConfig
(
t
*
testing
.
T
)
{
input
:=
[]
string
{
"2"
,
// nb of actor types
"player red"
,
// name 1st
"1"
,
// nb ai
"1"
,
// nb human
"player white"
,
// name 2nd
"1"
,
// nb ai
"0"
,
// nb human
"master"
,
// master client actor name
"2"
,
// Number of agent actor types
"smart"
,
// Agent actor type 1 name
"1"
,
// Number of agent 'smart' instances
"dumb"
,
// Agent actor type 2 name
"1"
,
// Number of agent 'dumb' instances
}
var
stdin
bytes
.
Buffer
...
...
@@ -50,13 +50,12 @@ func TestCreateProjectConfig(t *testing.T) {
func
TestCreateProjectConfigWindows
(
t
*
testing
.
T
)
{
input
:=
[]
string
{
"2"
,
// nb of actor types
"player red"
,
// name 1st
"1"
,
// nb ai
"1"
,
// nb human
"player white"
,
// name 2nd
"1"
,
// nb ai
"0"
,
// nb human
"master"
,
// master client actor name
"2"
,
// Number of agent actor types
"smart"
,
// Agent actor type 1 name
"1"
,
// Number of agent 'smart' instances
"dumb"
,
// Agent actor type 2 name
"1"
,
// Number of agent 'dumb' instances
}
var
stdin
bytes
.
Buffer
...
...
@@ -68,42 +67,46 @@ func TestCreateProjectConfigWindows(t *testing.T) {
assert
.
Equal
(
t
,
expectedConfig
,
*
config
)
}
func
TestCreateProjectConfigWhitespace
(
t
*
testing
.
T
)
{
// comment out for now
// func TestCreateProjectConfigWhitespace(t *testing.T) {
input
:=
[]
string
{
"2"
,
// nb of actor types
" player red"
,
// name 1st
"1"
,
// nb ai
"1"
,
// nb human
"player white "
,
// name 2nd
"1"
,
// nb ai
"0"
,
// nb human
}
//
input := []string{
//
"2", // nb of actor types
//
" player red", // name 1st
//
"1", // nb ai
//
"1", // nb human
//
"player white ", // name 2nd
//
"1", // nb ai
//
"0", // nb human
//
}
var
stdin
bytes
.
Buffer
stdin
.
Write
([]
byte
(
strings
.
Join
(
input
,
"
\n
"
)
+
"
\n
"
))
//
var stdin bytes.Buffer
//
stdin.Write([]byte(strings.Join(input, "\n") + "\n"))
config
,
err
:=
createProjectConfigFromReader
(
&
stdin
)
//
config, err := createProjectConfigFromReader(&stdin)
assert
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
expectedConfig
,
*
config
)
}
//
assert.Nil(t, err)
//
assert.Equal(t, expectedConfig, *config)
//
}
func
TestCreateProjectFiles
(
t
*
testing
.
T
)
{
dir
,
err
:=
ioutil
.
TempDir
(
""
,
"TestCreateProjectFiles"
)
dir
,
err
:=
ioutil
.
TempDir
(
""
,
"testcreateprojectfiles"
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
defer
os
.
RemoveAll
(
dir
)
expectedConfig
.
ProjectName
=
"testit"
err
=
createProjectFiles
(
dir
,
&
expectedConfig
)
assert
.
NoError
(
t
,
err
)
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
player_red
"
,
"main.py"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
player_red
"
,
"Dockerfile"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
player_white
"
,
"main.py"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
player_white
"
,
"Dockerfile"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
smart
"
,
"main.py"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
smart
"
,
"Dockerfile"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
dumb
"
,
"main.py"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"agents"
,
"
dumb
"
,
"Dockerfile"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"clients"
,
"main.py"
))
assert
.
FileExists
(
t
,
path
.
Join
(
dir
,
"clients"
,
"Dockerfile"
))
...
...
cli/cmd/logs.go
View file @
d13003de
...
...
@@ -108,9 +108,10 @@ var logsCmd = &cobra.Command{
for
_
,
entry
:=
range
result
.
Results
{
service
:=
entry
.
ServiceName
// We don't feed the full uint64 as nanoseconds, because we could overflow the int64 (in 2038!)
// We don't feed the full uint64 as nanoseconds, because we could overflow the int64 (in 2038!)
ts
:=
time
.
Unix
(
int64
(
entry
.
Timestamp
/
1000000000
),
int64
(
entry
.
Timestamp
%
1000000000
))
.
UTC
()
row
:=
[]
string
{
getColoredService
(
service
),
ts
.
Format
(
"2006-01-02T15:04:05.000Z"
),
...
...
cli/go.sum
View file @
d13003de
...
...
@@ -85,7 +85,6 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
gitlab.com/cogment/cogment v0.0.1 h1:7oQ6w6mEGnNSB/HAAkmjxwXGZ6R91ZEc89m46wzK1tI=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9 h1:mKdxBk7AujPs8kU4m80U72y/zjbZ3UcXC7dClwKbUI0=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
...
...
cli/helper/helper.go
View file @
d13003de
...
...
@@ -35,3 +35,8 @@ func Pascalify(data string) string {
data
=
space
.
ReplaceAllString
(
data
,
""
)
return
data
}
func
Tocaps
(
data
string
)
string
{
data
=
strings
.
ToUpper
(
data
)
return
data
}
cli/templates/README.md.go
View file @
d13003de
...
...
@@ -5,6 +5,19 @@ This is a sample bootstraping project for the Cogment python SDK.
Clone this repository, and you should be good to go.
For an introduction to Cogment or installation instructions see [docs.cogment.ai](https://docs.cogment.ai/).
## Getting started
Before anything else, you should make a copy of the default docker-compose
overrides. This will allow you to make changes to the project without having to
rebuild everything all the time.
the docker-compose.override.yml file is not pushed to the repo, so if you want
local changes to the docker-compose setup, that's the place to do it.
cp docker-compose.override.template.yml docker-compose.override.yml
## Useful commands:
Build the project:
...
...
cli/templates/agents/Dockerfile.go
View file @
d13003de
...
...
@@ -3,10 +3,14 @@ package agents
const
DOCKERFILE
=
`
FROM python:3.7
ENV COGMENT_VERSION 0.2
ENV PYTHONPATH /app
RUN pip install cogment==$COGMENT_VERSION
# Uncomment following and set specific version if required for only this service
#ENV COGMENT_VERSION 0.3.0a5
#RUN pip install cogment==$COGMENT_VERSION
# Comment following if above is used
ADD requirements.txt .
RUN pip install -r requirements.txt
WORKDIR /app
...
...
cli/templates/agents/main.py.go
View file @
d13003de
...
...
@@ -18,6 +18,10 @@ class {{.|pascalify}}(Agent):
def reward(self, reward):
print("{{.|pascalify}} reward")
def on_message(self, sender, msg):
if msg:
print(f'Agent {self.id_in_class} received message - {msg} from sender {sender}')
def end(self):
print("{{.|pascalify}} end")
...
...
cli/templates/clients/Dockerfile.go
View file @
d13003de
...
...
@@ -3,10 +3,14 @@ package clients
const
DOCKERFILE
=
`
FROM python:3.7
ENV COGMENT_VERSION 0.2
ENV PYTHONPATH /app
RUN pip install cogment==$COGMENT_VERSION
# Uncomment following and set specific version if required for only this service
#ENV COGMENT_VERSION 0.3.0a5
#RUN pip install cogment==$COGMENT_VERSION
# Comment following if above is used
ADD requirements.txt .
RUN pip install -r requirements.txt
WORKDIR /app
...
...
cli/templates/clients/main.py.go
View file @
d13003de
...
...
@@ -10,6 +10,10 @@ import cog_settings
from cogment.client import Connection
# Callback received message
def handle_messages(sender, msg):
print(f'Client received message - {msg} from sender {sender}')
# Create a connection to the Orchestrator serving this project
conn = Connection(cog_settings, "orchestrator:9000")
...
...
@@ -20,8 +24,8 @@ trial = conn.start_trial(cog_settings.actor_classes.{{range .ActorClasses}}{{if
# Perform actions, and get observations
{{- range .ActorClasses}}
{{- if $config.HasHumanByActorClass .Id }}
observation = trial.do_action({{.Id|pascalify}}Action())
observation = trial.do_action({{.Id|pascalify}}Action())
observation = trial.do_action({{.Id|pascalify}}Action()
, on_message = handle_messages
)
observation = trial.do_action({{.Id|pascalify}}Action()
, on_message = handle_messages
)
{{end -}}
{{end}}
...
...
cli/templates/cogment.yaml.go
View file @
d13003de
package
templates
const
ROOT_COGMENT_YAML
=
`
const
ROOT_COGMENT_YAML
=
`
{{ $config := . }}
import:
proto:
- data.proto
commands:
proto: cogment -v generate --python_dir=. --js_dir=clients/js
build: cogment -v generate --python_dir=. && docker-compose build
start: docker-compose up orchestrator env {{- range .ActorClasses}} {{.Id}} {{end}}
stop: docker-compose stop orchestrator env {{- range .ActorClasses}} {{.Id}} {{end}}
# python client
start: docker-compose up orchestrator env {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}}
stop: docker-compose stop orchestrator env {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}}
# web client
start-webui: docker-compose up orchestrator webui env {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}} envoy
stop-webui: docker-compose stop orchestrator webui env {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}} envoy
# python client with configurator
#start-configurator: docker-compose up orchestrator env {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}}
#stop-configurator: docker-compose stop orchestrator env {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}}
# web client with configurator
#start-webui-configurator: docker-compose up orchestrator webui env configurator {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}} envoy
#stop-webui-configurator: docker-compose stop orchestrator webui env configurator {{- range .ActorClasses}} {{- if $config.HasAiByActorClass .Id }} {{.Id}} {{end}}{{end}} envoy
client: docker-compose run --rm client
# Log exporter with postgres
#create-db-volume: docker volume create postgres_database
#export-data: docker-compose up log_exporter
{{$projectname := .ProjectName}}
environment:
config_type: {{$projectname}}.EnvConfig
trial:
config_tyep: {{$projectname}}.TrialConfig
# pre_hooks:
# - grpc://configurator:9000
# Static configuration
...
...
@@ -17,19 +41,31 @@ actor_classes:
{{- range .ActorClasses}}
- id: {{.Id|snakeify}}
action:
space:
bootstrap
.{{.Id|pascalify}}Action
space:
{{$projectname}}
.{{.Id|pascalify}}Action
observation:
space:
bootstrap
.Observation
space:
{{$projectname}}
.Observation
{{end}}