metaparticle 0.0.0.2 → 0.0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 72e6bca15b3f9fb3198690f96bea9840de1d665b
4
- data.tar.gz: 051d24f35141478dbf1c68f2817737bb844a35f1
3
+ metadata.gz: 492814e5564bd831f4a080f5acc257486137ae8b
4
+ data.tar.gz: f5c6c0f9a832176ac36e544c908dc52bc7508eb5
5
5
  SHA512:
6
- metadata.gz: 4d8aa6c0f87c8a4f140fa84e9ef351ddc9f2ce8941df8fb272c40249e2f0e2339312febfad0b5ec5e12253fae7d2835e9c2f4279a81651c8a45bc7498231da84
7
- data.tar.gz: 66a710887de263ffcfe9d6ac6fcb08f05b16c3371d4a8075e26f05eaf40e2f720ca4e24100bb8dbfb89b7f4faebadfbf7068f8c5f931a098db808b506b326a49
6
+ metadata.gz: bb41dd5cbc791b435778dfb94fe6f7bcbdc35c2145e42b4297503d05ce2b4772bb61aeadf0bc0ce3a456d3f06ae661e34ef56623ac7fafd747ce4ce17f0eaea6
7
+ data.tar.gz: '0328471120553b40ddad93553a7edbfde5c8bad300b73bc1ed18429867701432daebc25f7504e8dfc827e52f8587b0b776da1b05dbad7f2da33a699c27007df2'
@@ -0,0 +1,5 @@
1
+ require "metaparticle/version"
2
+ require 'metaparticle/base'
3
+
4
+ module Metaparticle
5
+ end
@@ -0,0 +1,79 @@
1
+ require "ostruct"
2
+ require "metaparticle/docker"
3
+ require "metaparticle/docker_builder"
4
+ require "metaparticle/docker_runner"
5
+ require "metaparticle/metaparticle_runner"
6
+
7
+ module Metaparticle
8
+ class Base
9
+ def initialize(app, *args, &block)
10
+ @app = app
11
+ if block_given?
12
+ if block.arity == 1
13
+ block.call(self)
14
+ else
15
+ instance_eval(&block)
16
+ end
17
+ end
18
+ end
19
+
20
+ def call(env)
21
+ @app.call(env)
22
+ end
23
+
24
+ def containerize(&block)
25
+ @config = OpenStruct.new(block.call)
26
+ run!
27
+ end
28
+
29
+ private
30
+ def write_dockerfile
31
+ dockerfile = <<-DOCKERFILE
32
+ FROM ruby:2.4-alpine
33
+
34
+ RUN mkdir -p /#{@config.name}
35
+ WORKDIR /#{@config.name}
36
+
37
+ COPY Gemfile /#{@config.name}/
38
+ COPY Gemfile.lock /#{@config.name}/
39
+ RUN bundle install
40
+
41
+ COPY . /#{@config.name}/
42
+ CMD rackup
43
+ DOCKERFILE
44
+ File.open("Dockerfile", "w") do |f|
45
+ f.write(dockerfile)
46
+ end
47
+ end
48
+
49
+ def docker
50
+ @docker ||= Docker.new
51
+ end
52
+
53
+ def builder
54
+ klass = @config.builder || 'docker'
55
+ @builder ||= classify("#{klass}_builder").new(@config)
56
+ end
57
+
58
+ def runner
59
+ klass = @config.runner || 'docker'
60
+ @runner ||= classify("#{klass}_runner").new(@config)
61
+ end
62
+
63
+ def classify(name)
64
+ Object.const_get("Metaparticle::"+name.split('_').collect!{ |w| w.capitalize }.join)
65
+ end
66
+
67
+ def run!
68
+ if docker.in_docker_container?
69
+ puts "in container..."
70
+ end
71
+ @config.image = "#{@config.repository}/#{@config.name}"
72
+ write_dockerfile
73
+ builder.build
74
+ builder.push
75
+ runner.run
76
+ return true
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,26 @@
1
+ module Metaparticle
2
+ class Docker
3
+ def in_docker_container?
4
+ if ENV['METAPARTICLE_IN_CONTAINER'] == "true"
5
+ return true
6
+ end
7
+
8
+ # Using same hack to work on macOS
9
+ begin
10
+ info = File.readlines('/proc/1/cgroup')
11
+
12
+ # horribly ineffient, can do this better
13
+ if !info.select {|line| line =~ /docker/}.empty?
14
+ return true
15
+ end
16
+ if !info.select {|line| line =~ /kubepods/}.empty?
17
+ return true
18
+ end
19
+ rescue
20
+ return false
21
+ end
22
+
23
+ return false
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ module Metaparticle
2
+ class DockerBuilder
3
+ def initialize(config)
4
+ @config = config
5
+ end
6
+
7
+ def build
8
+ `docker build -t #{@config.image} .`
9
+ end
10
+
11
+ def push
12
+ `docker push #{@config.image}`
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ module Metaparticle
2
+ class DockerRunner
3
+ def initialize(config)
4
+ @config = config
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,48 @@
1
+ require 'fileutils'
2
+
3
+ module Metaparticle
4
+ class MetaparticleRunner
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def run
10
+ options = {
11
+ name: @config.name,
12
+ guid: 1234567,
13
+ services: [
14
+ {
15
+ name: @config.name,
16
+ replicas: @config.replicas,
17
+ containers: [
18
+ {
19
+ image: @config.image
20
+ }
21
+ ],
22
+ ports: @config.ports.map {|p| {number: p}}
23
+ }
24
+ ],
25
+ serve: {
26
+ name: @config.name
27
+ }
28
+ }
29
+ if @config.public
30
+ options[:serve][:public] = true
31
+ end
32
+
33
+ create_directory
34
+
35
+ File.open(".metaparticle/service.json", "w") do |f|
36
+ f.write(options.to_json)
37
+ end
38
+
39
+ `mp-compiler -f .metaparticle/service.json'`
40
+ `mp-compiler -f .metaparticle/service.json --deploy=false --attach=true'`
41
+ end
42
+
43
+ private
44
+ def create_directory
45
+ FileUtils::mkdir_p('.metaparticle')
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module Metaparticle
2
+ VERSION = "0.0.0.3"
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metaparticle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.2
4
+ version: 0.0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Hein
@@ -59,7 +59,14 @@ email:
59
59
  executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
- files: []
62
+ files:
63
+ - lib/metaparticle.rb
64
+ - lib/metaparticle/base.rb
65
+ - lib/metaparticle/docker.rb
66
+ - lib/metaparticle/docker_builder.rb
67
+ - lib/metaparticle/docker_runner.rb
68
+ - lib/metaparticle/metaparticle_runner.rb
69
+ - lib/metaparticle/version.rb
63
70
  homepage: https://metaparticle.io/
64
71
  licenses:
65
72
  - MIT