Remove all the TypeScript code to start over again with something different

This commit is contained in:
R Tyler Croy 2019-12-13 21:03:46 -08:00
parent 55824515ce
commit d55f7f60ca
No known key found for this signature in database
GPG Key ID: E5C92681BEF6CEA2
18 changed files with 0 additions and 7794 deletions

View File

@ -1,30 +0,0 @@
/*
* This test file will verify the parsing behavior of the configure block
*/
import { MIN_PIPELINE, parse } from '../utils';
describe('configure {}', () => {
it('should pass without a configure block', () => {
expect(parse(MIN_PIPELINE)).toHaveLength(0);
});
it('should pass with an empty configure block', () => {
expect(parse(`configure {} ${MIN_PIPELINE}`)).toHaveLength(0);
});
it('should pass on an empty settings block within the configure {}', () => {
expect(parse(`configure { github {} } ${MIN_PIPELINE}`)).toHaveLength(0);
});
it('should fail on a missing block', () => {
expect(parse(`configure { github } ${MIN_PIPELINE}`)).not.toHaveLength(0);
});
it('should pass on a settings block within the configure {}', () => {
expect(parse(`configure { github { account = 'rtyler' } } ${MIN_PIPELINE}`)).toHaveLength(0);
});
it('should pass on a many settings within the configure {}', () => {
expect(parse(`configure { github { account = 'rtyler' endpoint = 'api.github.com' } } ${MIN_PIPELINE}`)).toHaveLength(0);
});
});

View File

@ -1,24 +0,0 @@
/*
* This test file will verify the parsing behavior of the pipeline block
*/
import fs from 'fs';
import path from 'path';
import { MIN_PIPELINE, parse } from '../utils';
describe('pipeline {}', () => {
it('should pass with the minimum viable pipeline', () => {
expect(parse(MIN_PIPELINE)).toHaveLength(0);
});
describe('with full examples', () => {
const examples_dir = path.join(__dirname, '..', '..', 'examples');
fs.readdirSync(examples_dir).filter(filename => filename.endsWith('.otto')).map((filename) => {
it(`should be able to parse ${filename}`, () => {
const buffer = fs.readFileSync(path.join(examples_dir, filename), 'utf8');
expect(parse(buffer)).toHaveLength(0);
});
});
});
});

View File

@ -1,27 +0,0 @@
/*
* This test file will verify the parsing behavior of the use block
*/
import { MIN_PIPELINE, parse } from '../utils';
describe('use {}', () => {
it('should fail on an empty string', () => {
expect(parse('')).toHaveLength(1);
});
it('should pass on an empty use block', () => {
expect(parse(`use {} ${MIN_PIPELINE}`)).toHaveLength(0);
});
it('should pass on a use with stdlib', () => {
expect(parse(`use { stdlib } ${MIN_PIPELINE}`)).toHaveLength(0);
});
it('should fail on a use with another symbol', () => {
expect(parse(`use { koopa } ${MIN_PIPELINE}`)).toHaveLength(1);
});
it('should pass with a string', () => {
expect(parse(`use { 'some/path' } ${MIN_PIPELINE}`)).toHaveLength(0);
});
});

View File

@ -1,55 +0,0 @@
import antlr from 'antlr4';
import { ErrorListener } from 'antlr4/error/ErrorListener';
import { OttoLexer } from './build/parser/JavaScript/OttoLexer';
import { OttoListener } from './build/parser/JavaScript/OttoListener';
import { Otto } from './build/parser/JavaScript/Otto';
export const MIN_PIPELINE = 'pipeline { stages { stage { } } }';
class Visitor {
visitChildren(ctx) {
if (!ctx) {
return;
}
if (ctx.children) {
return ctx.children.map(child => {
if (child.children && child.children.length != 0) {
return child.accept(this);
} else {
return child.getText();
}
});
}
}
}
class JestListener extends ErrorListener {
public errors: Array<any> = [];
syntaxError(recognizer, offendingSymbol, line, column, msg, e) {
this.errors.push({
line: line,
column: column,
error: e,
message: msg,
});
}
}
export function parse(buffer) {
let chars = new antlr.InputStream(buffer);
let lexer = new OttoLexer(chars);
let tokens = new antlr.CommonTokenStream(lexer);
let parser = new Otto(tokens);
parser.buildParseTrees = true;
parser.removeErrorListeners();
const errorListener = new JestListener();
parser.addErrorListener(errorListener);
let tree = parser.pipeline();
tree.accept(new Visitor());
return errorListener.errors;
}

View File

@ -1,10 +0,0 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
moduleNameMapper: {
"^@otto/grammar/(.*)$": "<rootDir>/grammar/build/parser/JavaScript/$1",
"^@otto/(.*)$": "<rootDir>/lib/src/$1",
"^@otto-orchestrator/(.*)$": "<rootDir>/services/orchestrator/src/$1",
"^@otto-parser/(.*)$": "<rootDir>/services/parser/src/$1",
},
};

View File

@ -1,18 +0,0 @@
/**
* The logger package will create a simple default logger for use with feathers
* services
*/
import { createLogger, format, transports } from 'winston'
export default createLogger({
// To see more detailed errors, change this to 'debug'
format: format.combine(
format.splat(),
format.simple(),
),
level: process.env.LOG_LEVEL || 'info',
transports: [
new transports.Console(),
],
})

View File

@ -1,29 +0,0 @@
/**
* This module acts as the simple wrapper for serving any feathers application
* in the project
*/
import logger from '@otto/logger'
import { Application } from '@feathersjs/express'
/**
* The serveApp function expects a Feathers application which it can start
* serving on its configured port
*
* This method is *asynchronous* and will not return a success or fail
*
* @param app An instantiated feathers application
*/
export function serveApp(app: Application) {
const port: Number = app.get('port')
const server: any = app.listen(port)
process.on('unhandledRejection', (reason, p) =>
logger.error('Unhandled Rejection at: Promise ', p, reason),
)
server.on('listening', () =>
logger.info('Feathers application started on http://%s:%d', app.get('host'), port),
)
}

7197
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,51 +0,0 @@
{
"name": "otto",
"version": "0.0.1",
"description": "Your friendly continuous delivery companion",
"main": "index.js",
"directories": {
"example": "examples"
},
"dependencies": {
"@feathersjs/configuration": "^2.0.6",
"@feathersjs/express": "^1.3.1",
"@feathersjs/feathers": "^3.3.1",
"@types/feathersjs__configuration": "^1.0.3",
"@types/feathersjs__express": "^1.1.6",
"@types/jest": "^24.0.15",
"antlr4": "^4.7.2",
"compression": "^1.7.4",
"cors": "^2.8.5",
"dredd": "^11.2.9",
"helmet": "^3.18.0",
"module-alias": "^2.2.0",
"nodemon": "^1.19.1",
"ts-lint": "^4.5.1",
"tslib": "^1.10.0",
"typescript": "^3.5.2",
"uuid": "^3.3.2",
"winston": "^3.2.1"
},
"devDependencies": {
"jest": "^24.8.0",
"ts-jest": "^24.0.2"
},
"scripts": {
"build": "tsc",
"test": "jest"
},
"repository": {
"type": "git",
"url": "git+https://github.com/rtyler/otto.git"
},
"author": "R Tyler Croy",
"license": "AGPL-3.0",
"bugs": {
"url": "https://github.com/rtyler/otto/issues"
},
"homepage": "https://github.com/rtyler/otto#readme",
"_moduleAliases": {
"@root": ".",
"@otto": "build/lib/src/"
}
}

View File

@ -1,4 +0,0 @@
= Otto Orchestrator
The Otto Orchestration service is responsible for provisioning agents to do their
necessary work.

View File

@ -1,54 +0,0 @@
import modalias from 'module-alias'
modalias()
import configuration from '@feathersjs/configuration'
import express from '@feathersjs/express'
import feathers from '@feathersjs/feathers'
import logger from '@otto/logger'
import { serveApp } from '@otto/server'
logger.info('Starting orchestrator')
const app = express(feathers())
// We need to fish out the orchestrator specific settings
const settings = configuration()(app)
app.configure(() => {
// tslint:disable:no-string-literal
Object.keys(settings['orchestrator']).forEach((key) => {
app.set(key, settings['orchestrator'][key])
})
// tslint:enable:no-string-literal
})
app.configure(express.rest())
app.configure(() => {
const service = {
get: (id: feathers.Id) => {
logger.info(`Invoking get for ${id}`)
const response = {
ops: [
{
context: '0x1',
data: {
env: {},
script: 'echo "Hello World"',
timeout_s: 600,
},
id: '0xdeadbeef',
type: 'RUNPROC',
},
],
self: id,
services: {
datastore: 'http://localhost:3031/',
},
}
return Promise.resolve(response)
},
}
app.use('/v1/manifest', service)
})
serveApp(app)

View File

@ -1,134 +0,0 @@
= Otto Parser
The Otto Parser service is responsible for taking a buffer, typically the
contents of a `.otto` file and converting that into the internal representation
that Otto uses for a configured pipeline.
== Internal Representation
The requirements for the internal representation of a continuous delivery
pipeline are as follows:
* Configuration data must be kept all in one place
* It should be possible to reason about the runtime resources, and
opportunities for re-use ahead of time.
* Runtime resource allocation must be separable from everything else, in
effect, Otto must be able to send off resource allocation requests as soon as
possible, with only pointers back to the specific pipeline
* The path of execution must be numbered and trackable within the system. Other
components will need to be able to refer back to the internal representation to
determine where in the execution of the pipeline the process is currently.
=== Example
Below is an example of a simple Otto pipeline, and its corresponding internal
representation.
.Simple.otto
[source, otto]
----
use {
stdlib
}
configure {
slack {
channel = '#otto'
}
}
pipeline {
stages {
stage {
name = 'Build'
runtime {
docker {
image = 'ruby:latest'
}
}
cache {
gems = ['vendor/']
}
steps {
sh 'ruby --version'
}
}
stage {
name = 'Test'
runtime {
from 'Build'
}
cache {
use gems
}
steps {
sh 'env'
}
}
}
}
----
[NOTE]
====
The description of this internal representation is YAML for the convenience of
this documentation, there is _zero_ guarantee that the actual internal
representation is stored in this fashion
====
.Simple.otto-internal
[source,yaml]
----
ottoVersion: 1
libraries:
- type: builtin
ref: stdlib
configuration:
slack:
settings:
channel:
encrypted: false
value: '#otto'
runtimes:
# Most dynamically provisioned runtimes will not have any user-specified
# named
- name:
type: docker
args:
image: 'ruby:latest'
# Stages are indexed based on when they are parsed, not necessarily when they
# are expected to execute, which may be in parallel
stages:
- name: 'Build'
before:
after:
runtime: 0
steps:
- type: 'sh'
args:
- 'ruby --version'
# `capture` and `restore` both would support archiving of artifacts and
# caching of files and directories between the different stages
capture:
gems:
- path: 'gems/'
type: 'directory'
restore:
- name: 'Test'
before:
# Reference the stage by index
after: 0
runtime: 0
steps:
- type: 'sh'
args:
- 'env'
capture:
restore:
- gems
----

View File

@ -1,19 +0,0 @@
import Orf from '../src/Orf'
describe('Orf', () => {
it('should instantiate', () => {
expect(new Orf()).toBeTruthy()
})
it('should have a version', () => {
expect((new Orf()).version).toBeGreaterThan(0)
})
describe('when serialized', () => {
it('should serialize by default', () => {
const o = new Orf()
expect(JSON.stringify(o)).toBeTruthy()
})
})
})

View File

@ -1,8 +0,0 @@
import ParseListener from '../src/ParseListener'
describe('ParseListener', () => {
it('should instantiate', () => {
expect(new ParseListener()).toBeTruthy()
})
})

View File

@ -1,79 +0,0 @@
/*
* Otto Representation Format: this file contains the necessary to maintain the
* internal representation of a parsed .otto file.
*
* See the parser README for more information
*/
// tslint:disable:max-classes-per-file
enum LibraryType {
Builtin,
FileReference,
}
class Library {
protected readonly libraryType: LibraryType
protected readonly libraryRef: string
}
class Setting {
protected readonly encrypted: Boolean
protected readonly value: any
}
class Configuration {
protected readonly settings: Map<string, Setting>
}
interface Runtime {
}
interface Step {
}
interface FileCapture {
}
class Stage {
protected readonly name: string
protected before: Stage
protected after: Stage
protected runtime: Runtime
protected steps: Step[] = []
protected capture: Map<string, FileCapture>
protected restore: String[]
}
/**
* Orf is the Otto Representation Format and acts as the parsed and serialized
* format of a .otto file, suitable for consumption by components within Otto.
*/
export default class Orf {
/** The version field is for system compatibility */
public readonly version = 1
/**
* An array of libraries which must be loaded at runtime
*/
protected libraries: Library[] = []
/**
* A map of configuration objects for configuring arbitrary
* steps/libraries/etc
*/
protected configuration: Map<string, Configuration>
/**
* An ordered array of runtimes which will be used throughout the process
*/
protected runtimes: Runtime[] = []
/**
* An ordered array of stages as they have been parsed, not necessary how
* they will be executed which may be more of a directed graph.
*/
protected stages: Stage[] = []
constructor() {
this.configuration = new Map<string, Configuration>()
}
}

View File

@ -1,9 +0,0 @@
/*
* The ParseListener is the initial entrypoint for building the graph
*/
import { Otto } from '@otto/grammar/Otto'
import { OttoLexer } from '@otto/grammar/OttoLexer'
import { OttoListener } from '@otto/grammar/OttoListener'
export default class ParseListener extends OttoListener {
}

View File

@ -1,34 +0,0 @@
{
"compilerOptions": {
"alwaysStrict" : true,
"baseUrl" : ".",
"outDir": "./build",
"module" : "commonjs",
"lib" : ["es2017"],
"moduleResolution": "node",
"esModuleInterop": true,
"importHelpers" : true,
"target": "es2015",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noUnusedLocals": false,
"strictNullChecks": true,
"skipLibCheck": true,
"paths": {
"@otto-orchestrator/*": ["./services/orchestrator/src/*"],
"@otto-parser/*": ["./services/parser/src/*"],
"@otto/grammar/*": ["./grammar/build/parser/JavaScript/*"],
"@otto/*": ["./lib/src/*"]
},
"typeRoots" : [
"./node_modules/@types"
]
},
"exclude": [
"**/__tests__/*.ts"
]
}

View File

@ -1,12 +0,0 @@
{
"extends": [
"tslint:recommended"
],
"jsRules": {},
"rules": {
"semicolon" : false,
"quotemark" : false,
"interface-name" : false
},
"rulesDirectory": []
}