├── docs └── appliance │ ├── vols │ ├── entry.d │ │ ├── 99-entry-complete.sh │ │ ├── entrypoint │ │ └── 01-trust-certs.sh │ ├── identity-conf │ │ ├── identity-ui-settings.json │ │ ├── notice.html │ │ └── identity-seed.json │ ├── nginx │ │ ├── conf.d │ │ │ ├── connect.conf │ │ │ ├── default.conf │ │ │ ├── topomojo.conf │ │ │ └── identity.conf │ │ ├── html │ │ │ └── index.html │ │ └── nginx.conf │ └── topomojo-conf │ │ └── topomojo-ui-settings.json │ ├── cfssl │ ├── scripts │ │ ├── meta-ca.json │ │ ├── meta-int.json │ │ ├── meta-host.json │ │ ├── generate-certificate.sh │ │ └── config.json │ ├── setup.sh │ └── Readme.md │ ├── scripts │ ├── start.sh │ ├── enable-apphost.sh │ ├── set-proxy.sh │ ├── ova-shutdown.sh │ └── install-docker.sh │ └── docker-compose.yml ├── src ├── TopoMojo.Web │ ├── seed-data.json.example │ ├── Exceptions │ │ └── Exceptions.cs │ ├── Models │ │ ├── DocumentModels.cs │ │ └── DbSeedModel.cs │ ├── Options │ │ ├── DatabaseOptions.cs │ │ ├── CacheOptions.cs │ │ ├── FileUploadOptions.cs │ │ ├── AuthorizationOptions.cs │ │ ├── BrandingOptions.cs │ │ └── HeaderOptions.cs │ ├── web.config │ ├── Extensions │ │ ├── ClaimsPrincipalExtensions.cs │ │ ├── FileUploadStartupExtensions.cs │ │ ├── IdentityExtensions.cs │ │ ├── IdentityResolverStartupExtensions.cs │ │ ├── TopoMojoStartupExtensions.cs │ │ ├── CorsExtensions.cs │ │ ├── CachingExtensions.cs │ │ ├── DatabaseExtensions.cs │ │ └── ForwardingStartupExtensions.cs │ ├── migration-undo.ps1 │ ├── migration-undo.sh │ ├── Infrastructure │ │ ├── HubCache.cs │ │ ├── ApiKeyAuthenticationExtensions.cs │ │ ├── TicketAuthenticationExtensions.cs │ │ ├── ServiceHostWrapper.cs │ │ ├── DisableFormValueModelBindingFilter.cs │ │ ├── RequestFormLimitsFilter.cs │ │ ├── TextMediaTypeFormatter.cs │ │ ├── ScheduledTasksService.cs │ │ ├── HeaderInspectionMiddleware.cs │ │ ├── JsonExceptionMiddleware.cs │ │ ├── CrossSiteRequestMiddleware.cs │ │ ├── FileUploadMonitor.cs │ │ └── BearerCookieMiddleware.cs │ ├── migration-add.sh │ ├── AppConstants.cs │ ├── migration-add.ps1 │ ├── Data │ │ └── Migrations │ │ │ ├── PostgreSQL │ │ │ └── TopoMojoDb │ │ │ │ ├── 20210206154002_challenge.cs │ │ │ │ ├── 20200603185146_Audience.cs │ │ │ │ └── 20210218013150_ExpandTemplateLimits.cs │ │ │ └── SqlServer │ │ │ └── TopoMojoDb │ │ │ ├── 20210206153956_challenge.cs │ │ │ ├── 20210218013145_ExpandTemplateLimits.cs │ │ │ └── 20200603185140_Audience.cs │ ├── TopoMojo.Web.csproj │ ├── Controllers │ │ ├── _Controller.cs │ │ └── ChatController.cs │ └── Program.cs ├── TopoMojo.Client │ ├── Options.cs │ ├── TopoMojo.Client.csproj │ ├── StartupExtensions.cs │ └── TopoMojoStub.cs ├── TopoMojo.Abstractions │ ├── Models │ │ ├── Client.cs │ │ ├── JanitorReport.cs │ │ ├── Document.cs │ │ ├── ConsoleSummary.cs │ │ ├── Search.cs │ │ ├── Message.cs │ │ ├── User.cs │ │ ├── GamespaceSpec.cs │ │ ├── GamespaceModels.cs │ │ ├── VmTemplate.cs │ │ ├── Registration.cs │ │ ├── HypervisorServiceConfiguration.cs │ │ ├── Vm.cs │ │ ├── WorkspaceModels.cs │ │ └── TemplateModels.cs │ ├── Interfaces │ │ ├── IIdentityResolver.cs │ │ ├── ITopoMojoClient.cs │ │ └── IHypervisorService.cs │ └── TopoMojo.Abstractions.csproj ├── TopoMojo.Core │ ├── Data │ │ ├── Abstractions │ │ │ ├── IStoreUserContext.cs │ │ │ ├── IEntity.cs │ │ │ ├── IUserStore.cs │ │ │ ├── ITemplateStore.cs │ │ │ ├── IDataStore[TEntity].cs │ │ │ ├── IStore[TEntity].cs │ │ │ ├── IGamespaceStore.cs │ │ │ └── IWorkspaceStore.cs │ │ ├── Entities │ │ │ ├── Permission.cs │ │ │ ├── Extensions │ │ │ │ ├── Template.cs │ │ │ │ ├── WorkspaceExtensions.cs │ │ │ │ └── PermissionExtensions.cs │ │ │ ├── Player.cs │ │ │ ├── Worker.cs │ │ │ ├── Message.cs │ │ │ ├── Activity.cs │ │ │ ├── User.cs │ │ │ ├── Gamespace.cs │ │ │ ├── Template.cs │ │ │ └── Workspace.cs │ │ ├── Stores │ │ │ ├── _CachedStore.cs │ │ │ ├── TEntityStore.cs │ │ │ ├── TemplateStore.cs │ │ │ └── UserStore.cs │ │ └── TopoMojoDbContext.cs │ ├── Services │ │ ├── Mappers │ │ │ ├── MessageProfile.cs │ │ │ ├── ResolutionContext.cs │ │ │ ├── UserProfile.cs │ │ │ ├── TemplateProfile.cs │ │ │ ├── GamespaceProfile.cs │ │ │ └── WorkspaceProfile.cs │ │ ├── IdentityService.cs │ │ ├── _Service.cs │ │ └── UserService.cs │ ├── Extensions │ │ ├── SearchExtensions.cs │ │ ├── Gamespace.cs │ │ └── TemplateExtensions.cs │ ├── TopoMojo.Core.csproj │ ├── Exceptions.cs │ └── CoreOptions.cs └── TopoMojo.vSphere │ ├── TopoMojo.vSphere.csproj │ ├── VimReferences.cs │ ├── VimHelpers.cs │ ├── INetworkManager.cs │ └── DatastorePath.cs ├── test ├── TopoMojo.Core.Tests │ ├── IdentityResolver.cs │ ├── StubMemoryCache.cs │ ├── TopoMojo.Core.Tests.csproj │ ├── StubDistributedCache.cs │ ├── CoreTest.cs │ ├── TopoTest.cs │ └── TemplateTests.cs └── local.http ├── .github └── workflows │ └── main.yml ├── Dockerfile ├── Readme.md └── LICENSE.md /docs/appliance/vols/entry.d/99-entry-complete.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo $0 $(date) 4 | -------------------------------------------------------------------------------- /docs/appliance/vols/identity-conf/identity-ui-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "applicationName": "Foundry ID", 3 | "apiUrl": "https://id.foundry.local" 4 | } 5 | -------------------------------------------------------------------------------- /src/TopoMojo.Web/seed-data.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "Users": [ 3 | { 4 | "GlobalId": "9fd3c38e-58b0-4af1-80d1-1895af91f1f9", 5 | "Name": "Administrator", 6 | "IsAdmin": true 7 | } 8 | ] 9 | } -------------------------------------------------------------------------------- /docs/appliance/cfssl/scripts/meta-ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "names": [ 3 | { 4 | "organization": "Local Foundry Root CA" 5 | } 6 | ], 7 | "key": { 8 | "algo": "rsa", 9 | "size": 2048 10 | }, 11 | "CN": "Local Foundry Root CA" 12 | } 13 | -------------------------------------------------------------------------------- /docs/appliance/vols/entry.d/entrypoint: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ -z "$ENTRY_DIR" ]; then ENTRY_DIR=/entry.d; fi 5 | 6 | for f in $(find $ENTRY_DIR/*.sh); do 7 | echo [entrypoint] running $f ... 8 | chmod 755 $f 9 | $f 10 | done 11 | 12 | exec "$@" 13 | 14 | -------------------------------------------------------------------------------- /docs/appliance/scripts/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## ensure certificates generates before running containers 3 | 4 | cfssl=/home/admin/appliance/cfssl 5 | 6 | if [ ! -e "$cfssl/output/appliance.pem" ]; then 7 | /bin/bash $cfssl/setup.sh 8 | fi 9 | 10 | /usr/local/bin/docker-compose up -d 11 | -------------------------------------------------------------------------------- /docs/appliance/cfssl/scripts/meta-int.json: -------------------------------------------------------------------------------- 1 | { 2 | "names": [ 3 | { 4 | "C": "US", 5 | "O": "Local Foundry Authority" 6 | } 7 | ], 8 | "key": { 9 | "algo": "rsa", 10 | "size": 2048 11 | }, 12 | "CN": "Local Foundry Authority" 13 | } 14 | -------------------------------------------------------------------------------- /docs/appliance/cfssl/scripts/meta-host.json: -------------------------------------------------------------------------------- 1 | { 2 | "names": [ 3 | { 4 | "C": "US" 5 | } 6 | ], 7 | "key": { 8 | "algo": "rsa", 9 | "size": 2048 10 | }, 11 | "CN": "Application Host", 12 | "hosts": [ 13 | "foundry.local", 14 | "*.foundry.local" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /src/TopoMojo.Web/Exceptions/Exceptions.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | using System; 5 | 6 | namespace TopoMojo.Web 7 | { 8 | public class AuthenticationFailedException : Exception {} 9 | } 10 | -------------------------------------------------------------------------------- /src/TopoMojo.Web/Models/DocumentModels.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Web.Models 5 | { 6 | public class ImageFile 7 | { 8 | public string Filename { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/TopoMojo.Client/Options.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. 2 | // Released under a MIT (SEI) license. See LICENSE.md in the project root. 3 | 4 | namespace TopoMojo.Client 5 | { 6 | public class Options 7 | { 8 | public string Url { get; set; } 9 | public string Key { get; set; } 10 | public int MaxRetries { get; set; } = 2; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/TopoMojo.Abstractions/Models/Client.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. 2 | // Released under a MIT (SEI) license. See LICENSE.md in the project root. 3 | 4 | namespace TopoMojo.Models 5 | { 6 | public class Client 7 | { 8 | public string Id { get; set; } 9 | public string Scope { get; set; } 10 | public string Url { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/TopoMojo.Core/Data/Abstractions/IStoreUserContext.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Data.Abstractions 5 | { 6 | public interface IStoreUserContext 7 | { 8 | int UserId { get; set; } 9 | bool UserIsAdmin { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/TopoMojo.Core/Data/Entities/Permission.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | using System; 5 | 6 | namespace TopoMojo.Data 7 | { 8 | [Flags] 9 | public enum Permission { 10 | None = 0, 11 | Editor = 0x01, 12 | Manager = 0xff 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/TopoMojo.Abstractions/Interfaces/IIdentityResolver.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | using TopoMojo.Models; 5 | 6 | namespace TopoMojo.Abstractions 7 | { 8 | public interface IIdentityResolver 9 | { 10 | User User { get; } 11 | Client Client { get; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/TopoMojo.Core/Data/Abstractions/IEntity.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Data.Abstractions 5 | { 6 | public interface IEntity 7 | { 8 | int Id { get; set; } 9 | string GlobalId { get; set; } 10 | System.DateTime WhenCreated { get; set; } 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/TopoMojo.Abstractions/Models/JanitorReport.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. 2 | // Released under a MIT (SEI) license. See LICENSE.md in the project root. 3 | 4 | using System; 5 | 6 | namespace TopoMojo.Models 7 | { 8 | public class JanitorReport 9 | { 10 | public int Id { get; set; } 11 | public string Name { get; set; } 12 | public string Reason { get; set; } 13 | public DateTime Age { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/TopoMojo.Abstractions/Models/Document.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | using System; 5 | 6 | namespace TopoMojo.Models 7 | { 8 | public class Document 9 | { 10 | public string Text { get; set; } 11 | public string WhenSaved { get; set; } 12 | public string Timestamp { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/TopoMojo.Core/Data/Entities/Extensions/Template.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Data.Extensions 5 | { 6 | public static class TemplateExtensions 7 | { 8 | public static bool IsLinked(this Template template) 9 | { 10 | return template.ParentId != null; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/TopoMojo.Abstractions/Models/ConsoleSummary.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. 2 | // Released under a MIT (SEI) license. See LICENSE.md in the project root. 3 | 4 | namespace TopoMojo.Models 5 | { 6 | public class ConsoleSummary 7 | { 8 | public string Id { get; set; } 9 | public string IsolationId { get; set; } 10 | public string Name { get; set; } 11 | public string Url { get; set; } 12 | public bool IsRunning { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/TopoMojo.Web/Options/DatabaseOptions.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Web 5 | { 6 | public class DatabaseOptions 7 | { 8 | public string Provider { get; set; } = "InMemory"; 9 | public string ConnectionString { get; set; } = "topomojo_db"; 10 | public string SeedFile { get; set; } = "seed-data.json"; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/TopoMojo.Core/Data/Abstractions/IUserStore.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | using System.Threading.Tasks; 5 | using TopoMojo.Models; 6 | 7 | namespace TopoMojo.Data.Abstractions 8 | { 9 | public interface IUserStore : IDataStore 10 | { 11 | Task LoadDetail(int id); 12 | Task MemberOf(string globalId, Models.User profile); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/TopoMojo.Web/Options/CacheOptions.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. 2 | // Released under a MIT (SEI) license. See LICENSE.md in the project root. 3 | 4 | namespace TopoMojo.Web 5 | { 6 | public class CacheOptions 7 | { 8 | public string Key { get; set; } 9 | public string RedisUrl { get; set; } 10 | public string SharedFolder { get; set; } 11 | public string DataProtectionFolder { get; set; } = ".dpk"; 12 | public int CacheExpirationSeconds { get; set; } = 300; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/TopoMojo.Web/Options/FileUploadOptions.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Web 5 | { 6 | public class FileUploadOptions 7 | { 8 | public long MaxFileBytes { get; set; } 9 | public string IsoRoot { get; set; } = "tm"; 10 | public string TopoRoot { get; set; } = "tm"; 11 | public string DocRoot { get; set; } = "tm/_docs"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /docs/appliance/vols/entry.d/01-trust-certs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo running $0 3 | set -e 4 | if [ -z "$ENTRY_DIR" ]; then ENTRY_DIR=/entry.d; fi 5 | 6 | dst=/etc/pki/ca-trust/source/anchors 7 | if [ -d "$dst" ]; then 8 | echo "updating trusted certificates (rhel)" 9 | cp -f $ENTRY_DIR/*.crt $dst | true 10 | update-ca-trust 11 | fi 12 | 13 | dst=/usr/local/share/ca-certificates 14 | if [ -d "$dst" ]; then 15 | echo "updating trusted certificates (debian)" 16 | cp -f $ENTRY_DIR/*.crt $dst | true 17 | update-ca-certificates 18 | fi 19 | -------------------------------------------------------------------------------- /src/TopoMojo.Abstractions/Models/Search.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Models 5 | { 6 | public class Search 7 | { 8 | public string Term { get; set; } 9 | public int Skip { get; set; } 10 | public int Take { get; set; } 11 | public string Sort { get; set; } 12 | public string[] Filter { get; set; } = new string[] {}; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /docs/appliance/scripts/enable-apphost.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## auto start / stop with systemd 3 | 4 | cat < /etc/systemd/system/appliance.service 5 | [Unit] 6 | Description=Control appliance stack 7 | Requires=docker.service 8 | After=docker.service 9 | 10 | [Service] 11 | Type=oneshot 12 | RemainAfterExit=yes 13 | WorkingDirectory=/home/admin/appliance 14 | ExecStart=/bin/bash scripts/start.sh 15 | ExecStop=/usr/local/bin/docker-compose down 16 | 17 | [Install] 18 | WantedBy=multi-user.target 19 | 20 | EOF 21 | 22 | systemctl daemon-reload 23 | systemctl enable appliance 24 | -------------------------------------------------------------------------------- /docs/appliance/vols/nginx/conf.d/connect.conf: -------------------------------------------------------------------------------- 1 | 2 | server { 3 | server_name connect.*; 4 | listen 443 ssl http2; 5 | listen [::]:443 ssl http2; 6 | 7 | location /ticket { 8 | proxy_pass https://$arg_vmhost$uri; 9 | proxy_http_version 1.1; 10 | proxy_set_header Upgrade $http_upgrade; 11 | proxy_set_header Connection "upgrade"; 12 | proxy_request_buffering off; 13 | proxy_buffering off; 14 | proxy_read_timeout 86400s; 15 | proxy_send_timeout 86400s; 16 | proxy_ssl_session_reuse on; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/TopoMojo.Web/Models/DbSeedModel.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | namespace TopoMojo.Web.Models 5 | { 6 | public class DbSeedModel 7 | { 8 | public DbSeedUser[] Users { get; set; } = new DbSeedUser[] {}; 9 | } 10 | 11 | public class DbSeedUser 12 | { 13 | public string Name { get; set; } 14 | public string GlobalId { get; set; } 15 | public bool IsAdmin { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test/TopoMojo.Core.Tests/IdentityResolver.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2019 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | using TopoMojo.Abstractions; 5 | using TopoMojo.Models; 6 | 7 | namespace Tests 8 | { 9 | public class IdentityResolver : IIdentityResolver 10 | { 11 | public IdentityResolver(User user) 12 | { 13 | User = user; 14 | } 15 | 16 | public User User { get; } 17 | public Client Client { get; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/TopoMojo.Abstractions/TopoMojo.Abstractions.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | Jeff Mattson 6 | Software Engineering Institute 7 | Copyright 2020 Carnegie Mellon University. 8 | TopoMojo.Abstractions 9 | MIT 10 | https://github.com/cmu-sei/TopoMojo 11 | 1.3.6 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | release: 5 | types: [ "published" ] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | 13 | - name: Build and push Docker images 14 | uses: docker/build-push-action@v1.1.0 15 | with: 16 | username: ${{ secrets.DOCKERHUB_USERNAME }} 17 | password: ${{ secrets.DOCKERHUB_PASSWORD }} 18 | repository: cmusei/topomojo 19 | tag_with_ref: true 20 | push: ${{ startsWith(github.ref, 'refs/tags/') }} 21 | build_args: "commit=${{ github.sha }}" 22 | -------------------------------------------------------------------------------- /src/TopoMojo.Core/Data/Abstractions/ITemplateStore.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Carnegie Mellon University. All Rights Reserved. 2 | // Released under a 3 Clause BSD-style license. See LICENSE.md in the project root for license information. 3 | 4 | using System.Threading.Tasks; 5 | 6 | namespace TopoMojo.Data.Abstractions 7 | { 8 | public interface ITemplateStore : IDataStore