ood_appkit 0.3.6 → 1.0.0

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: 850674682fcbe959939aca02f9a20171d4a8571a
4
- data.tar.gz: e206532de1309dff2dff6558707c907f41a56db5
3
+ metadata.gz: 639be3508b4fec095c35a5d4975b786d1ec8b4dd
4
+ data.tar.gz: 772b0ddc945ae9a38247c68fde45a611627b08f2
5
5
  SHA512:
6
- metadata.gz: a40fe490ed48c377fa3ec0db0de57b1915d5e44be529f71eac3800316e78a6731698cbaa0b7ed53481b9d07ff1a3b4498ffc65b965fb818f3cfe7f2de4f0027f
7
- data.tar.gz: 14f764aca4ebde3697dae62b4dc0661df5264cae9958771990639a837e59a68dca838885483ed0ae1b21ee8738b5fa2ea4d3f8b44f5a8b7df66c3ac86a8a5688
6
+ metadata.gz: 00d0a0e9c72158520b4a7fa8bf7350134e321fb32fb3baea420d74ec5b912b32988e052c37231aec5bed0585ce8a1d0337e8bf46855982c69dd698b52eff40f2
7
+ data.tar.gz: 62d4891cac215848b39c1668582360ebe2749edfa224db14453c139d85bf0db61d2cf5b57f0013fbad2fe6130895df5952c146ee0b54d22fe86f418d34d4b880
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015-2016 Ohio Supercomputer Center
1
+ Copyright (c) 2015-2017 Ohio Supercomputer Center
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -525,11 +525,7 @@ host is done through:
525
525
  ```ruby
526
526
  # An enumerable list of clusters
527
527
  OodAppkit.clusters
528
- #=> #<OodAppkit::Clusters>
529
-
530
- # Create list of cluster titles
531
- OodAppkit.clusters.map(&:title)
532
- #=> ["My Cluster", "Tiny Cluster", "Big Cluster"]
528
+ #=> #<OodCore::Clusters>
533
529
 
534
530
  # Count number of clusters available
535
531
  OodAppkit.clusters.count
@@ -545,114 +541,18 @@ You can access a given cluster with id `my_cluster` by:
545
541
  ```ruby
546
542
  # Get object describing my HPC center's `my_cluster`
547
543
  OodAppkit.clusters[:my_cluster]
548
- #=> #<OodAppkit::ClusterDecorator>
544
+ #=> #<OodCore::Cluster>
549
545
 
550
546
  # or...
551
547
  OodAppkit.clusters["my_cluster"]
552
- #=> #<OodAppkit::ClusterDecorator>
548
+ #=> #<OodCore::Cluster>
553
549
 
554
550
  # Trying to access a non-existant cluster
555
551
  OodAppkit.clusters[:invalid_cluster]
556
552
  #=> nil
557
553
  ```
558
554
 
559
- A cluster object comes with some pre-defined helper methods to help you find
560
- the cluster that meets your needs:
561
-
562
- ```ruby
563
- # Get the cluster of our choosing
564
- my_cluster = OodAppkit.clusters[:my_cluster]
565
-
566
- # Is this cluster valid (can I the user access the servers provided by it?)
567
- my_cluster.valid?
568
- #=> true
569
-
570
- # Is this cluster considered a High Performance Computing (hpc) cluster?
571
- # NB: A low performance computing cluster expects jobs that request a single
572
- # core and use minimal resources (e.g., a desktop for file browsing/editing,
573
- # a web server that submits jobs to an HPC cluster, visualization software)
574
- my_cluster.hpc_cluster?
575
- #=> false
576
-
577
- # ID of cluster object to find again in OodAppkit.clusters
578
- my_cluster.id #=> :my_cluster
579
-
580
- # URL of cluster
581
- my_cluster.url #=> "https://hpc.center.edu/clusters/my_cluster"
582
-
583
- # Check if it has a login server
584
- my_cluster.login_server? #=> true
585
-
586
- # Access login server object
587
- my_cluster.login_server
588
- #=> #<OodCluster::Servers::Ssh>
589
- ```
590
-
591
- As this object is an `Enumerable` you can create subsets of clusters that your
592
- app only cares for in an initializer:
593
-
594
- ```ruby
595
- # I only want clusters that are valid for the currently running user
596
- valid_clusters = OodAppkit::Clusters.new(
597
- OodAppkit.clusters.select(&:valid?)
598
- )
599
- #=> #<OodAppkit::Clusters>
600
-
601
- # Create list of cluster titles from these valid clusters
602
- valid_clusters.map(&:title)
603
- #=> ["My Cluster"]
604
-
605
- # I only want HPC clusters that I can submit solver jobs to
606
- hpc_clusters = OodAppkit::Clusters.new(
607
- OodAppkit.clusters.select(&:hpc_cluster?)
608
- )
609
- ```
610
-
611
- Depending on the type of server chosen, different helper methods will be
612
- available to the developer. You can find more details on this at
613
- https://github.com/OSC/ood_cluster.
614
-
615
- #### Validations
616
-
617
- A cluster may support more validations than whether the current user can access
618
- it. The extra validations are defined in the configuration YAML file as such:
619
-
620
- ```yaml
621
- validators:
622
- cluster:
623
- - type: "OodAppkit::Validators::Groups"
624
- data:
625
- groups:
626
- - "ruby"
627
- allow: true
628
- rsv_query:
629
- - type: "OodAppkit::Validators::Groups"
630
- data:
631
- groups:
632
- - "sysp"
633
- - "hpcsoft"
634
- allow: false
635
- ```
636
-
637
- where the key is used in the `OodAppkit::ClusterDecorator#valid?` method.
638
-
639
- One such validation is whether the current user can query their reservation
640
- information for the given cluster:
641
-
642
- ```ruby
643
- # Check if reservation query object is valid (am I allowed to use it)
644
- # NB: Definitely use this as some users may be privileged and have access to
645
- # view ALL reservations. This can cause the app to hang.
646
- my_cluster.valid?(:rsv_query) #=> true
647
-
648
- # I am allowed to use it so let's query for user's reservations
649
- require 'ood_reservations'
650
- my_rsv_query = OodReservations::Query.build(cluster: my_cluster).reservations
651
- #=> [ #<OodReservations::Reservation>, ... ]
652
- ```
653
-
654
- You can learn more about the reservation query object by visiting
655
- https://github.com/OSC/ood_reservations.
555
+ You can read more about this cluster object at https://github.com/OSC/ood_core.
656
556
 
657
557
  #### Configuration
658
558
 
@@ -663,7 +563,7 @@ different config file through the environment variable `OOD_CLUSTERS`
663
563
  OOD_CLUSTERS="/path/to/my/config.yml"
664
564
  ```
665
565
 
666
- Or a directory with aptly named configuration files (name of file is id of
566
+ Or a directory with cluster named configuration files (name of file is id of
667
567
  cluster):
668
568
 
669
569
  ```sh
@@ -1,5 +1,6 @@
1
1
  require 'redcarpet'
2
2
  require 'ostruct'
3
+ require 'ood_core'
3
4
 
4
5
  module OodAppkit
5
6
  # An object that stores and adds configuration options.
@@ -12,8 +13,12 @@ module OodAppkit
12
13
  attr_writer :dataroot
13
14
 
14
15
  # Cluster information for local HPC center
15
- # @return [OpenStruct] hash of available clusters
16
- attr_accessor :clusters
16
+ # @return [OodCore::Clusters] hash of available clusters
17
+ def clusters
18
+ @clusters ||= parse_clusters(ENV['OOD_CLUSTERS'])
19
+ end
20
+
21
+ attr_writer :clusters
17
22
 
18
23
  # A markdown renderer used when rendering `*.md` or `*.markdown` views
19
24
  # @return [Redcarpet::Markdown] the markdown renderer used
@@ -65,17 +70,6 @@ module OodAppkit
65
70
  self.dataroot = ENV['OOD_DATAROOT'] || ENV['RAILS_DATAROOT']
66
71
  self.dataroot ||= "~/#{ENV['OOD_PORTAL'] || "ondemand"}/data/#{ENV['APP_TOKEN']}" if ENV['APP_TOKEN']
67
72
 
68
- # Initialize list of available clusters
69
- c_config = Pathname.new(ENV['OOD_CLUSTERS'] || '/etc/ood/config/clusters.d')
70
- self.clusters = Clusters.new(
71
- begin
72
- ConfigParser.parse(config: c_config).map { |k, v| ClusterDecorator.new(id: k.to_sym, **v) }
73
- rescue ConfigParser::InvalidConfigPath
74
- STDERR.puts "Invalid cluster config specified: #{c_config}"
75
- []
76
- end
77
- )
78
-
79
73
  # Add markdown template support
80
74
  self.markdown = Redcarpet::Markdown.new(
81
75
  Redcarpet::Render::HTML,
@@ -127,5 +121,13 @@ module OodAppkit
127
121
 
128
122
  self.enable_log_formatter = ::Rails.env.production?
129
123
  end
124
+
125
+ private
126
+ # Read in cluster config and parse it
127
+ def parse_clusters(config)
128
+ OodCore::Clusters.load_file(config || '/etc/ood/config/clusters.d')
129
+ rescue OodCore::ConfigurationNotFound
130
+ OodCore::Clusters.new([])
131
+ end
130
132
  end
131
133
  end
@@ -1,4 +1,4 @@
1
1
  module OodAppkit
2
2
  # The current version of OodAppkit
3
- VERSION = "0.3.6"
3
+ VERSION = "1.0.0"
4
4
  end
data/lib/ood_appkit.rb CHANGED
@@ -4,10 +4,6 @@ require 'ood_appkit/url'
4
4
  require 'ood_appkit/files_rack_app'
5
5
  require 'ood_appkit/markdown_template_handler'
6
6
  require 'ood_appkit/log_formatter'
7
- require 'ood_appkit/config_parser'
8
- require 'ood_appkit/cluster_decorator'
9
- require 'ood_appkit/clusters'
10
- require 'ood_appkit/validator'
11
7
 
12
8
  # The main namespace for OodAppkit. Provides a global configuration.
13
9
  module OodAppkit
@@ -22,9 +18,4 @@ module OodAppkit
22
18
  require 'ood_appkit/urls/files'
23
19
  require 'ood_appkit/urls/editor'
24
20
  end
25
-
26
- # A namespace for validators used to validate a cluster
27
- module Validators
28
- require 'ood_appkit/validators/groups'
29
- end
30
21
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ood_appkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Franz
8
+ - Jeremy Nicklas
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-04-13 00:00:00.000000000 Z
12
+ date: 2017-04-17 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rails
@@ -31,33 +32,19 @@ dependencies:
31
32
  - !ruby/object:Gem::Version
32
33
  version: 4.0.7
33
34
  - !ruby/object:Gem::Dependency
34
- name: ood_support
35
+ name: ood_core
35
36
  requirement: !ruby/object:Gem::Requirement
36
37
  requirements:
37
38
  - - "~>"
38
39
  - !ruby/object:Gem::Version
39
- version: '0.0'
40
+ version: 0.0.1
40
41
  type: :runtime
41
42
  prerelease: false
42
43
  version_requirements: !ruby/object:Gem::Requirement
43
44
  requirements:
44
45
  - - "~>"
45
46
  - !ruby/object:Gem::Version
46
- version: '0.0'
47
- - !ruby/object:Gem::Dependency
48
- name: ood_cluster
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '0.0'
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: '0.0'
47
+ version: 0.0.1
61
48
  - !ruby/object:Gem::Dependency
62
49
  name: addressable
63
50
  requirement: !ruby/object:Gem::Requirement
@@ -119,6 +106,7 @@ description: Provides an interface to working with other Open OnDemand (OOD) app
119
106
  objects for providing branding and documentation within the apps.
120
107
  email:
121
108
  - efranz@osc.edu
109
+ - jnicklas@osc.edu
122
110
  executables: []
123
111
  extensions: []
124
112
  extra_rdoc_files: []
@@ -136,9 +124,6 @@ files:
136
124
  - app/views/ood_appkit/wiki/show.html.erb
137
125
  - config/routes.rb
138
126
  - lib/ood_appkit.rb
139
- - lib/ood_appkit/cluster_decorator.rb
140
- - lib/ood_appkit/clusters.rb
141
- - lib/ood_appkit/config_parser.rb
142
127
  - lib/ood_appkit/configuration.rb
143
128
  - lib/ood_appkit/engine.rb
144
129
  - lib/ood_appkit/files_rack_app.rb
@@ -150,8 +135,6 @@ files:
150
135
  - lib/ood_appkit/urls/files.rb
151
136
  - lib/ood_appkit/urls/public.rb
152
137
  - lib/ood_appkit/urls/shell.rb
153
- - lib/ood_appkit/validator.rb
154
- - lib/ood_appkit/validators/groups.rb
155
138
  - lib/ood_appkit/version.rb
156
139
  - lib/tasks/ood_appkit_tasks.rake
157
140
  - test/dummy/README.rdoc
@@ -1,46 +0,0 @@
1
- require 'ood_cluster'
2
-
3
- module OodAppkit
4
- # A decorator that adds a presentation layer to the {OodCluster::Cluster} object
5
- class ClusterDecorator < SimpleDelegator
6
- # The identifier used as the key in the OodAppkit clusters hash (used for
7
- # reverse searching)
8
- # @return [Symbol] the clusters hash key for this object
9
- attr_reader :id
10
-
11
- # The title used to describe this cluster to users
12
- # @return [String] the cluster title
13
- attr_reader :title
14
-
15
- # The URL for this cluster that users can use to view more information
16
- # @return [String] the cluster url
17
- attr_reader :url
18
-
19
- # @param cluster [OodCluster::Cluster] cluster object
20
- # @param id [#to_sym] id used in clusters hash of OodAppkit
21
- # @param title [#to_s] title of cluster
22
- # @param url [#to_s] url of cluster
23
- # @param validators [Hash{#to_sym=>Array<Validator>}] hash of validators
24
- def initialize(cluster:, id:, title: "", url: "", validators: {}, **_)
25
- super(cluster)
26
- @id = id.to_sym
27
- @title = title.to_s
28
- @url = url.to_s
29
- @validators = validators.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
30
- end
31
-
32
- # Whether the given method is valid (i.e., passes all supplied validators)
33
- # @param method [#to_sym] method to check if valid
34
- # @return [Boolean] whether this method is valid
35
- def valid?(method = :cluster)
36
- @validators.fetch(method.to_sym, []).all? { |v| v.success? }
37
- end
38
-
39
- # The comparison operator
40
- # @param other [#to_sym] object to compare against
41
- # @return [Boolean] whether objects are equivalent
42
- def ==(other)
43
- id == other.to_sym
44
- end
45
- end
46
- end
@@ -1,24 +0,0 @@
1
- module OodAppkit
2
- # An enumerable that holds a list of {ClusterDecorator} objects
3
- class Clusters
4
- include Enumerable
5
-
6
- # @param clusters [Array<ClusterDecorator>] list of cluster decorator objects
7
- def initialize(clusters = [])
8
- @clusters = clusters
9
- end
10
-
11
- # Find object in list from object's id
12
- # @param id [Object] id of cluster decorator object
13
- # @return [ClusterDecorator, nil] object if found
14
- def [](id)
15
- @clusters.detect { |v| v == id }
16
- end
17
-
18
- # Iterate over each of the clusters
19
- # @yield [obj] cluster decorator objects
20
- def each(&block)
21
- @clusters.each(&block)
22
- end
23
- end
24
- end
@@ -1,45 +0,0 @@
1
- require 'yaml'
2
- require 'json'
3
-
4
- module OodAppkit
5
- # Helper methods for parsing/deserializing yml configuration files
6
- module ConfigParser
7
- # Specific version hash in the yaml file to parse
8
- YAML_VERSION = 'v1'
9
-
10
- # Identifier used to distinguish class names when deserializing
11
- CLASS_ID = 'type'
12
-
13
- # Exception raise when unable to access config file or directory
14
- class InvalidConfigPath < StandardError; end
15
-
16
- # Parse/deserialize a configuration file or a set of configuration files
17
- # @param config [#to_s] configuration file or directory
18
- # @raise [InvalidConfigPath] if config path is inaccessible
19
- # @return [Hash] hash of deserialized config file
20
- def self.parse(config:)
21
- # use 'type' to distinguish class name in yaml file
22
- JSON.create_id = CLASS_ID
23
-
24
- config = Pathname.new(config.to_s).expand_path
25
- if config.file?
26
- parse_file config
27
- elsif config.directory?
28
- config.children.each_with_object({}) do |f, h|
29
- /^(.+)\.yml$/.match(f.basename.to_s) do
30
- hsh = parse_file(f)
31
- h[$1.to_sym] = hsh unless hsh.empty?
32
- end
33
- end
34
- else
35
- raise InvalidConfigPath, "invalid config path: #{config}"
36
- end
37
- end
38
-
39
- private
40
- # Parse a single yaml file
41
- def self.parse_file(file)
42
- JSON.load(JSON.dump(YAML.load(File.read(file.to_s)).fetch(YAML_VERSION, {}))).deep_symbolize_keys
43
- end
44
- end
45
- end
@@ -1,25 +0,0 @@
1
- module OodAppkit
2
- class Validator
3
- # Deserialize a validator object from JSON
4
- # @param object [Hash{#to_sym=>Object}] hash used defining context
5
- # @return [self] deserialized object
6
- def self.json_create(object)
7
- new object["data"].each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
8
- end
9
-
10
- def initialize(**_)
11
- end
12
-
13
- # Whether this validation was successful
14
- # @return [Boolean] whether successful
15
- def success?
16
- true
17
- end
18
-
19
- # Whether this validation was a failure
20
- # @return [Boolean] whether failure
21
- def failure?
22
- !success?
23
- end
24
- end
25
- end
@@ -1,38 +0,0 @@
1
- require 'ood_support'
2
-
3
- module OodAppkit
4
- module Validators
5
- # Class used to determine if user is in valid list of groups
6
- class Groups < Validator
7
- # @param groups [Array<#to_s>] list of groups
8
- # @param allow [Boolean] whether these groups are allowed access
9
- def initialize(groups: [], allow: true, **kwargs)
10
- super(kwargs)
11
- @groups = groups.map(&:to_s)
12
- @allow = allow
13
- end
14
-
15
- # Whether this validation was successful
16
- # @return [Boolean] whether successful
17
- def success?
18
- @allow ? in_user_groups?(@groups) : not_in_user_groups?(@groups)
19
- end
20
-
21
- private
22
- # List of groups user is in
23
- def user_groups
24
- OodSupport::User.new.groups.map(&:to_s)
25
- end
26
-
27
- # Whether any groups match user's groups
28
- def in_user_groups?(groups)
29
- !(groups & user_groups).empty?
30
- end
31
-
32
- # Whether groups don't correspond with any user group
33
- def not_in_user_groups?(groups)
34
- !in_user_groups?(groups)
35
- end
36
- end
37
- end
38
- end