virtuaservices 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/virtuaservices.rb +11 -0
- data/lib/virtuaservices/account.rb +72 -0
- data/lib/virtuaservices/authentication.rb +7 -0
- data/lib/virtuaservices/authentication/session.rb +28 -0
- data/lib/virtuaservices/concerns.rb +13 -0
- data/lib/virtuaservices/concerns/activable.rb +18 -0
- data/lib/virtuaservices/concerns/diagnosticable.rb +22 -0
- data/lib/virtuaservices/concerns/enumerable.rb +44 -0
- data/lib/virtuaservices/concerns/mime_typable.rb +36 -0
- data/lib/virtuaservices/concerns/premiumable.rb +15 -0
- data/lib/virtuaservices/concerns/sluggable.rb +27 -0
- data/lib/virtuaservices/concerns/typable.rb +17 -0
- data/lib/virtuaservices/monitoring.rb +12 -0
- data/lib/virtuaservices/monitoring/action.rb +25 -0
- data/lib/virtuaservices/monitoring/gateway.rb +37 -0
- data/lib/virtuaservices/monitoring/instance.rb +36 -0
- data/lib/virtuaservices/monitoring/route.rb +36 -0
- data/lib/virtuaservices/monitoring/service.rb +37 -0
- data/lib/virtuaservices/monitoring/websocket.rb +25 -0
- data/lib/virtuaservices/oauth.rb +7 -0
- data/lib/virtuaservices/oauth/application.rb +33 -0
- data/lib/virtuaservices/permissions.rb +10 -0
- data/lib/virtuaservices/permissions/category.rb +15 -0
- data/lib/virtuaservices/permissions/group.rb +30 -0
- data/lib/virtuaservices/permissions/right.rb +19 -0
- data/lib/virtuaservices/specs.rb +89 -0
- data/lib/virtuaservices/utils.rb +10 -0
- data/lib/virtuaservices/utils/controllers.rb +8 -0
- data/lib/virtuaservices/utils/controllers/base.rb +193 -0
- data/lib/virtuaservices/utils/controllers/checked.rb +14 -0
- data/lib/virtuaservices/utils/errors.rb +12 -0
- data/lib/virtuaservices/utils/errors/bad_request.rb +14 -0
- data/lib/virtuaservices/utils/errors/forbidden.rb +14 -0
- data/lib/virtuaservices/utils/errors/http_error.rb +30 -0
- data/lib/virtuaservices/utils/errors/not_found.rb +14 -0
- data/lib/virtuaservices/utils/loaders.rb +7 -0
- data/lib/virtuaservices/utils/loaders/heroku.rb +20 -0
- data/lib/virtuaservices/utils/micro_service.rb +170 -0
- data/lib/virtuaservices/utils/seeder.rb +25 -0
- data/lib/virtuaservices/version.rb +3 -0
- metadata +321 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 14c9250ccc5f41dec23c9cefe1be32a519667d8df724b037e5be4bee496c0faa
|
4
|
+
data.tar.gz: 4af97b4b7012372092b43c2741525baa7d7164a6d8c6ade9dc0cc1d9bf7f5052
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f735fdb67d12698228fc0c236d3749184012046161d2c71efae1ec3a43c169bb8aaf93c2098be49ec3cc7201ed0270db63c0ae099f74c7e63551fef82ccca489
|
7
|
+
data.tar.gz: 8affa59effed0aca1ad2f2c5df2969c543081afcd21cc2efcfa8613929b87ea3349d1616ff0c2094ebf65551e386c33f7efbf30681f55ae08de43d06604a1557
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'mongoid'
|
2
|
+
|
3
|
+
module Virtuaservices
|
4
|
+
autoload :Account , 'virtuaservices/account'
|
5
|
+
autoload :Authentication, 'virtuaservices/authentication'
|
6
|
+
autoload :Concerns , 'virtuaservices/concerns'
|
7
|
+
autoload :Monitoring , 'virtuaservices/monitoring'
|
8
|
+
autoload :OAuth , 'virtuaservices/oauth'
|
9
|
+
autoload :Permissions , 'virtuaservices/permissions'
|
10
|
+
autoload :Utils , 'virtuaservices/utils'
|
11
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
# A user account with all related attributes. It holds credentials and informations about a designated user.
|
3
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
|
+
class Account
|
5
|
+
include Mongoid::Document
|
6
|
+
include Mongoid::Timestamps
|
7
|
+
include ActiveModel::SecurePassword
|
8
|
+
include Virtuaservices::Concerns::Enumerable
|
9
|
+
|
10
|
+
# @!attribute [rw] username
|
11
|
+
# @return [String] the nickname the user chose at subscription, must be given, unique, and 6 or more characters long.
|
12
|
+
field :username, type: String
|
13
|
+
# @!attribute [r] password_digest
|
14
|
+
# @return [String] the password of the user, encrypted with the Blowfish algorithm.
|
15
|
+
field :password_digest, type: String
|
16
|
+
# @!attribute [rw] lastname
|
17
|
+
# @return [String] the last name (family name) of the user.
|
18
|
+
field :lastname, type: String, default: ''
|
19
|
+
# @!attribute [rw] firstname
|
20
|
+
# @return [String] the first name of the user.
|
21
|
+
field :firstname, type: String, default: ''
|
22
|
+
# @!attribute [rw] email
|
23
|
+
# @return [String] the email address of the user, useful to contact them ; it must be given, unique, and have an email format.
|
24
|
+
field :email, type: String
|
25
|
+
# @!attribute [rw] language
|
26
|
+
# @return [Symbol] the language preferred by this user.
|
27
|
+
enum_field :language, [:en_GB, :fr_FR], default: :fr_FR
|
28
|
+
# @!attribute [rw] gender
|
29
|
+
# @return [Symbol] the way you prefer the application to gender you.
|
30
|
+
enum_field :gender, [:female, :male, :neutral], default: :neutral
|
31
|
+
|
32
|
+
# @!attribute [w] password
|
33
|
+
# @return [String] password, in clear, of the user ; do not attempt to get the value, just set it when changing the password.
|
34
|
+
# @!attribute [w] password_confirmation
|
35
|
+
# @return [String] the confirmation of the password, do not get, just set it ; it must be the same as the password.
|
36
|
+
has_secure_password validations: false
|
37
|
+
|
38
|
+
# @!attribute [rw] groups
|
39
|
+
# @return [Array<Virtuaservices::Permissions::Group>] the groups giving their corresponding rights to the current account.
|
40
|
+
has_and_belongs_to_many :groups, class_name: 'Virtuaservices::Permissions::Group', inverse_of: :accounts
|
41
|
+
|
42
|
+
# @!attribute [rw] applications
|
43
|
+
# @return [Array<Virtuaservices::OAuth::Application] the applications this user has created and owns.
|
44
|
+
has_many :applications, class_name: 'Virtuaservices::OAuth::Application', inverse_of: :creator
|
45
|
+
# @!attribute [rw] services
|
46
|
+
# @return [Array<Virtuaservices::Monitoring::Service>] the services created by this user.
|
47
|
+
has_many :services, class_name: 'Virtuaservices::Monitoring::Service', inverse_of: :creator
|
48
|
+
# @!attribute [rw] sessions
|
49
|
+
# @return [Array<Virtuaservices::Authentication::Session>] the sessions on which this account is, or has been logged in.
|
50
|
+
has_many :sessions, class_name: 'Virtuaservices::Authentication::Session', inverse_of: :account
|
51
|
+
# @!attribute [rw] websockets
|
52
|
+
# @return [Array<Virtuaservices::Monitoring::Websocket>] the websockets created by the owner of this account.
|
53
|
+
has_many :websockets, class_name: 'Virtuaservices::Monitoring::Websocket', inverse_of: :creator
|
54
|
+
|
55
|
+
validates :username,
|
56
|
+
presence: {message: 'required'},
|
57
|
+
length: {minimum: 6, message: 'minlength', if: :username?},
|
58
|
+
uniqueness: {message: 'uniq', if: :username?}
|
59
|
+
|
60
|
+
validates :email,
|
61
|
+
presence: {message: 'required'},
|
62
|
+
format: {with: /\A[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}\z/, message: 'pattern', if: :email?},
|
63
|
+
uniqueness: {message: 'uniq', if: :email?}
|
64
|
+
|
65
|
+
validates :password,
|
66
|
+
presence: {message: 'required', if: ->{ !persisted? || password_digest_changed? }},
|
67
|
+
confirmation: {message: 'confirmation', if: :password_digest_changed?}
|
68
|
+
|
69
|
+
validates :password_confirmation,
|
70
|
+
presence: {message: 'required', if: :password_digest_changed?}
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Authentication
|
3
|
+
# A session represents the connection of the user on our frontend application. Nobody else than our frontend should
|
4
|
+
# have access to the session or it's content (in particular to the token), instead they shall use the OAuth2.0 protocol.
|
5
|
+
# A session shall ONLY be created by a premium application (only our frontend applications are premium).
|
6
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
7
|
+
class Session
|
8
|
+
include Mongoid::Document
|
9
|
+
include Mongoid::Timestamps
|
10
|
+
|
11
|
+
# @!attribute [rw] token
|
12
|
+
# @return [String] the unique token for this session, used to identify it and be sure the user is connected on this application.
|
13
|
+
field :token, type: String
|
14
|
+
# @!attribute [rw] websocket_id
|
15
|
+
# @return [String] the ID of the websocket on which the session is connected. It's not an association because instances are embedded.
|
16
|
+
field :websocket_id, type: String, default: ''
|
17
|
+
|
18
|
+
# @!attribute [rw] account
|
19
|
+
# @return [Virtuaservices::Account] the account connected to the application.
|
20
|
+
belongs_to :account, class_name: 'Virtuaservices::Account', inverse_of: :sessions
|
21
|
+
|
22
|
+
validates :token,
|
23
|
+
presence: {message: 'required'},
|
24
|
+
uniqueness: {message: 'uniq', if: :token?},
|
25
|
+
length: {minimum: 10, message: 'minlength', if: :token?}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
# This module holds the shared concerns to include in the desired models.
|
3
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
|
+
module Concerns
|
5
|
+
autoload :Activable , 'virtuaservices/concerns/activable'
|
6
|
+
autoload :Diagnosticable, 'virtuaservices/concerns/diagnosticable'
|
7
|
+
autoload :Enumerable , 'virtuaservices/concerns/enumerable'
|
8
|
+
autoload :MimeTypable , 'virtuaservices/concerns/mime_typable'
|
9
|
+
autoload :Premiumable , 'virtuaservices/concerns/premiumable'
|
10
|
+
autoload :Sluggable , 'virtuaservices/concerns/sluggable'
|
11
|
+
autoload :Typable , 'virtuaservices/concerns/typable'
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Concerns
|
3
|
+
# Concerns for the objects that can be activated or deactivated, included the corresponding scopes.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
module Activable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
# @!attribute [rw] active
|
10
|
+
# @return [Boolean] the active status of the instance, indicating if someone has deactivated it or not.
|
11
|
+
field :active, type: Boolean, default: true
|
12
|
+
|
13
|
+
scope :active , ->{ where(active: true) }
|
14
|
+
scope :inactive, ->{ where(active: false) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Concerns
|
3
|
+
# Includes the diagnostic URL field, and the related validations.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
module Diagnosticable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Module holding the class methods for the classes including this concern.
|
9
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
10
|
+
included do
|
11
|
+
# @!attribute [rw] diagnostic
|
12
|
+
# @return [String] the diagnostic URL to know the status of an entity (usually a gateway, or an instance of a service).
|
13
|
+
field :diagnostic, type: String, default: '/status'
|
14
|
+
|
15
|
+
validates :diagnostic,
|
16
|
+
presence: {message: "required"},
|
17
|
+
length: {minimum: 4, message: "minlength"},
|
18
|
+
format: {with: /\A(\/[a-z]+)+\z/, message: "pattern"}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Concerns
|
3
|
+
# Defines enumerations for the Mongoid models. An enumeration is a field that can only use a given set of values.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
module Enumerable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Submodule holding all the static methods add to the current subclass.
|
9
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
10
|
+
module ClassMethods
|
11
|
+
|
12
|
+
# Creates the field with the given name, set of possible values, and options.
|
13
|
+
# @param field_name [String] the name of the enumerated field.
|
14
|
+
# @param values [Array<Symbol>] the possible values of the enumerated field.
|
15
|
+
# @param options [Hash<Symbol, Any>] the possible options for the field.
|
16
|
+
def enum_field(field_name, values, options = {})
|
17
|
+
field :"enum_#{field_name}", type: Symbol, default: options[:default]
|
18
|
+
|
19
|
+
validates :"enum_#{field_name}", inclusion: {in: values.map(&:to_sym), message: 'inclusion'}
|
20
|
+
|
21
|
+
define_method field_name do
|
22
|
+
return self["enum_#{field_name}"]
|
23
|
+
end
|
24
|
+
|
25
|
+
define_method "#{field_name}=" do |value|
|
26
|
+
if values.include? value.to_sym
|
27
|
+
self["enum_#{field_name}"] = value.to_sym
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
values.map(&:to_sym).each do |value|
|
32
|
+
define_method "#{field_name}_#{value}!" do
|
33
|
+
self["enum_#{field_name}"] = value
|
34
|
+
end
|
35
|
+
|
36
|
+
define_method "#{field_name}_#{value}?" do
|
37
|
+
self["enum_#{field_name}"] == value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Concerns
|
3
|
+
# Includes the MIME type field to files to ensure only supported types are included.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
module MimeTypable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Submodule holding all the static methods add to the current subclass.
|
9
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
10
|
+
module ClassMethods
|
11
|
+
# Defines the MIME type attribute with the given possible MIME types.
|
12
|
+
# @param values [Array<String>] the possible MIME types, * can be used as wild cards.
|
13
|
+
def mime_type(values)
|
14
|
+
|
15
|
+
# @!attribute [rw] mime_type
|
16
|
+
# @return [String] the MIME type of the file, obtained from the uploaded file.
|
17
|
+
field :mime_type, type: String
|
18
|
+
|
19
|
+
validates :mime_type, presence: {message: 'required'}
|
20
|
+
|
21
|
+
validate :mime_type_validity, if: :mime_type?
|
22
|
+
|
23
|
+
# Validates the validity of the MIME type by checking if it respects any of the given mime types.
|
24
|
+
# If it does not respect any MIME types possible, it adds an error to the mime_type field and invalidates.
|
25
|
+
define_method :mime_type_validity do
|
26
|
+
values.each do |type|
|
27
|
+
type_regex = ::Regexp.new("^#{type.sub(/\*/, '(.+)')}$")
|
28
|
+
return true if !type_regex.match(mime_type).nil?
|
29
|
+
end
|
30
|
+
errors.add(:mime_type, 'pattern')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Concerns
|
3
|
+
# Includes the premium field to make the entity including it accessible only to premium applications or not.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
module Premiumable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
# @!attribute [rw] premium
|
10
|
+
# @return [Boolean] TRUE if the entity is made to be accessible only to premiuma pplications, FALSE otherwise.
|
11
|
+
field :premium, type: Boolean, default: false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Concerns
|
3
|
+
# Includes the slug field, always the same in all models.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
module Sluggable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Module holding the class methods for the classes including this concern.
|
9
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
10
|
+
module ClassMethods
|
11
|
+
# Add the field and its validations in the model including it.
|
12
|
+
# @param entity_type [String,Symbol] the name of the model including it, to be included in the error messages.
|
13
|
+
def make_sluggable(entity_type)
|
14
|
+
# @!attribute [rw] slug
|
15
|
+
# @return [String] the slug of the current entity ; it must be snake-cased, longer than four characters, unique for the entity and given.
|
16
|
+
field :slug, type: String
|
17
|
+
|
18
|
+
validates :slug,
|
19
|
+
length: {minimum: 4, message: 'minlength', if: :slug?},
|
20
|
+
format: {with: /\A[a-z]+(_[a-z]+)*\z/, message: 'pattern', if: :slug?},
|
21
|
+
uniqueness: {message: 'uniq', if: :slug?},
|
22
|
+
presence: {message: 'required'}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Concerns
|
3
|
+
# Concerns for the objects that can be activated or deactivated, included the corresponding scopes.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
module Typable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
include Virtuaservices::Concerns::Enumerable
|
10
|
+
|
11
|
+
# @!attribute [rw] type
|
12
|
+
# @return [Symbol] the type of the instance, determining its way of being deployed, restarted, etc.
|
13
|
+
enum_field :type, [:heroku, :local, :unix], default: :heroku
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
# The monitoring module holds all the logic about the services so they can be activated or deactivated.
|
3
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
|
+
module Monitoring
|
5
|
+
autoload :Action , 'virtuaservices/monitoring/action'
|
6
|
+
autoload :Gateway , 'virtuaservices/monitoring/gateway'
|
7
|
+
autoload :Instance , 'virtuaservices/monitoring/instance'
|
8
|
+
autoload :Route , 'virtuaservices/monitoring/route'
|
9
|
+
autoload :Service , 'virtuaservices/monitoring/service'
|
10
|
+
autoload :Websocket, 'virtuaservices/monitoring/websocket'
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Monitoring
|
3
|
+
# An action is made by an authorized user on the instance of a server to perform a task.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
class Action
|
6
|
+
include Mongoid::Document
|
7
|
+
include Mongoid::Timestamps
|
8
|
+
include Virtuaservices::Concerns::Enumerable
|
9
|
+
|
10
|
+
# @!attribute [rw] type
|
11
|
+
# @return [Symbol] the type of action you're making on this instance
|
12
|
+
enum_field :type, [:restart]
|
13
|
+
# @!attribute [rw] success
|
14
|
+
# @return [Boolean] TRUE if the action succeeded (or at least was successfully launched), FALSE otherwise.
|
15
|
+
field :success, type: Boolean, default: false
|
16
|
+
|
17
|
+
# @!attribute [rw] user
|
18
|
+
# @return [Virtuaservices::Account] the user performing the action on the instance.
|
19
|
+
belongs_to :user, class_name: 'Virtuaservices::Account'
|
20
|
+
# @!attribute [rw] instance
|
21
|
+
# @return [Virtuaservices::Monitoring::Instance] the instance of a service on which the action is performed.
|
22
|
+
embedded_in :instance, class_name: 'Virtuaservices::Monitoring::Instance', inverse_of: :actions
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Monitoring
|
3
|
+
# A gateway is a portal by which you access the different web services of the application suite.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
class Gateway
|
6
|
+
include Mongoid::Document
|
7
|
+
include Mongoid::Timestamps
|
8
|
+
include Virtuaservices::Concerns::Activable
|
9
|
+
include Virtuaservices::Concerns::Diagnosticable
|
10
|
+
include Virtuaservices::Concerns::Typable
|
11
|
+
|
12
|
+
# @!attribute [rw] url
|
13
|
+
# @return [String] the URL of the gateway, where the requests will be issued.
|
14
|
+
field :url, type: String
|
15
|
+
# @!attribute [rw] running
|
16
|
+
# @return [Boolean] the running status of the gateway, indicating if it can be used or not.
|
17
|
+
field :running, type: Boolean, default: false
|
18
|
+
# @!attribute [rw] gateways
|
19
|
+
# @return [String] the uniq token for this gateway, identifying it in the micro services.
|
20
|
+
field :token, type: String
|
21
|
+
|
22
|
+
scope :running , ->{ where(running: true) }
|
23
|
+
|
24
|
+
validates :url,
|
25
|
+
presence: {message: 'required'},
|
26
|
+
format: {
|
27
|
+
with: /\A(https?:\/\/)((localhost:[0-9]+)|(([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*)|(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b):([0-9]{2,6}))\/?\z/,
|
28
|
+
message: 'pattern',
|
29
|
+
if: :url?
|
30
|
+
}
|
31
|
+
|
32
|
+
validates :token,
|
33
|
+
presence: {message: 'required'},
|
34
|
+
uniqueness: {message: 'uniq'}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Virtuaservices
|
2
|
+
module Monitoring
|
3
|
+
# An instance is one of the services, deployed on one server. A service may have many instances to balance the load between them all.
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
+
class Instance
|
6
|
+
include Mongoid::Document
|
7
|
+
include Mongoid::Timestamps
|
8
|
+
include Virtuaservices::Concerns::Activable
|
9
|
+
include Virtuaservices::Concerns::Typable
|
10
|
+
|
11
|
+
# @!attribute [rw] url
|
12
|
+
# @return [String] the URL of the instance, where the requests will be issued.
|
13
|
+
field :url, type: String
|
14
|
+
# @!attribute [rw] running
|
15
|
+
# @return [Boolean] the running status of the instance, indicating if it can be used or not.
|
16
|
+
field :running, type: Boolean, default: false
|
17
|
+
# @!attribute [rw] data
|
18
|
+
# @return [Hash] the additional datas for this instance (for example for an Heroku instance it's all the data provided by the API)
|
19
|
+
field :data, type: Hash, default: {}
|
20
|
+
|
21
|
+
scope :running , ->{ where(running: true) }
|
22
|
+
|
23
|
+
# @!attribute [r] service
|
24
|
+
# @return [Virtuaservices::Monitoring::Service] the service this instance is linked to.
|
25
|
+
embedded_in :service, class_name: 'Virtuaservices::Monitoring::Service', inverse_of: :instances
|
26
|
+
# @!attribute [rw] actions
|
27
|
+
# @return [Virtuaservices::Monitoring::Action] the actions that has been performed on the service.
|
28
|
+
embeds_many :actions, class_name: 'Virtuaservices::Monitoring::Action', inverse_of: :instance
|
29
|
+
|
30
|
+
validates :url,
|
31
|
+
presence: {message: 'required'},
|
32
|
+
format: {with: /\A(https?:\/\/)((([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*)|(localhost:[0-9]{2,4})\/?)\z/, message: 'pattern', if: :url?}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|