Project

General

Profile

Download (4.85 KB) Statistics
| Branch: | Tag: | Revision:

runcible / test / support / repository_support.rb @ master

1
require 'rubygems'
2

    
3
require './lib/runcible'
4

    
5
class RepositorySupport
6
  FIXTURE_PATH = '/var/www/repositories'.freeze
7

    
8
  @@repo_id        = 'integration_test_id'
9
  @@repo_name      = @@repo_id
10

    
11
  def initialize(type  = 'yum')
12
    @repo_resource     = TestRuncible.server.extensions.repository
13
    @schedule_resource = TestRuncible.server.resources.repository_schedule
14
    @repo_extension    = TestRuncible.server.extensions.repository
15
    @task_resource     = TestRuncible.server.resources.task
16
    @task_group        = TestRuncible.server.resources.task_group
17
    @schedule_time     = '2012-09-25T20:44:00Z/P7D'
18
    @repo_type         = type
19
    @importer_type     = "#{@repo_type}_importer"
20

    
21
    if @repo_type == 'yum'
22
      @distributors = [Runcible::Models::YumDistributor.new('path', true, true, :id => 'yum_dist')]
23
      @repo_url     = "file://#{FIXTURE_PATH}/zoo5"
24
    elsif @repo_type == 'puppet'
25
      @distributors = [Runcible::Models::PuppetDistributor.new('path', true, true, :id => 'puppet_dist')]
26
      @repo_url     = 'http://davidd.fedorapeople.org/repos/random_puppet/'
27
    elsif @repo_type == 'python'
28
      @distributors = [Runcible::Models::PythonDistributor.new]
29
      @repo_url     = "https://pypi.python.org"
30
    elsif @repo_type == 'iso'
31
      @distributors = [Runcible::Models::IsoDistributor.new(true, true, :id => 'iso_distributor')]
32
      @repo_url     = "file://#{RepositorySupport::FIXTURE_PATH}/iso"
33
    elsif @repo_type == 'ostree'
34
      @distributors  = [Runcible::Models::OstreeDistributor.new(:ostree_publish_directory => '/path',
35
                                                                :id => 'ostree_dist',
36
                                                                :relative_path => "/relpath")]
37
      @repo_url      = "file://#{FIXTURE_PATH}/ostree/fedora"
38
      @importer_type = "ostree_web_importer"
39
    end
40
  end
41

    
42
  def distributor
43
    @repo_extension.retrieve_with_details(RepositorySupport.repo_id)['distributors'].first
44
  end
45

    
46
  def self.repo_name
47
    @@repo_name
48
  end
49

    
50
  def self.repo_id
51
    @@repo_id
52
  end
53

    
54
  def self.repo_url
55
    @@repo_url
56
  end
57

    
58
  attr_writer :repo_url
59

    
60
  attr_reader :schedule_time
61

    
62
  attr_reader :task_resource
63

    
64
  attr_reader :repo_resource
65

    
66
  attr_writer :task
67

    
68
  attr_reader :task
69

    
70
  def create_and_sync_repo(options = {})
71
    destroy_repo
72
    create_repo(options)
73
    sync_repo(options)
74
  end
75

    
76
  def create_repo(options = {})
77
    importer_config = {:id => @importer_type, :feed => @repo_url}
78
    importer_config.merge!(options[:importer_config]) if options.key?(:importer_config)
79

    
80
    repo = @repo_resource.retrieve(RepositorySupport.repo_id)
81
    unless repo.nil?
82
      destroy_repo
83
    end
84

    
85
    if options[:importer]
86
      repo = @repo_extension.create_with_importer(RepositorySupport.repo_id, importer_config)
87
    elsif options[:importer_and_distributor]
88
      repo = @repo_extension.create_with_importer_and_distributors(RepositorySupport.repo_id,
89
                                 importer_config, @distributors)
90
    else
91
      repo = @repo_resource.create(RepositorySupport.repo_id)
92
    end
93

    
94
  rescue RestClient::ResourceNotFound
95

    
96
    if options[:importer]
97
      repo = @repo_extension.create_with_importer(RepositorySupport.repo_id, importer_config)
98
    elsif options[:importer_and_distributor]
99
      repo = @repo_extension.create_with_importer_and_distributors(RepositorySupport.repo_id,
100
                                     importer_config, @distributors)
101
    else
102
      repo = @repo_resource.create(RepositorySupport.repo_id)
103
    end
104

    
105
    return repo
106
  end
107

    
108
  def sync_repo(options = {})
109
    task = @repo_resource.sync(RepositorySupport.repo_id)
110

    
111
    unless options[:wait]
112
      self.wait_on_response(task)
113
    end
114

    
115
    task
116
  end
117

    
118
  def wait_on_response(response)
119
    wait_on_tasks(response['spawned_tasks'].map { |task_ref| {'task_id' => task_ref['task_id']} })
120
  end
121

    
122
  def wait_on_task_group(response)
123
    until @task_group.completed?(@task_group.summary(response["group_id"]))
124
      self.sleep_if_needed
125
    end
126
    @task_group.summary(response["group_id"])
127
  end
128

    
129
  def wait_on_tasks(tasks)
130
    tasks.map do |task|
131
      self.wait_on_task(task)
132
    end
133
  end
134

    
135
  def wait_on_task(task)
136
    until ['finished', 'error', 'timed_out', 'canceled', 'reset'].include?(task['state'])
137
      self.sleep_if_needed
138
      task = @task_resource.poll(task['task_id'])
139
    end
140
    task
141
  end
142

    
143
  def sleep_if_needed
144
    if VCR.configuration.default_cassette_options[:record] != :none
145
      sleep 0.5 # do not overload backend engines
146
    end
147
  end
148

    
149
  def create_schedule
150
    schedule = @schedule_resource.create(RepositorySupport.repo_id, @importer_type, @schedule_time)
151
    schedule['_id']
152
  end
153

    
154
  def destroy_repo(id = RepositorySupport.repo_id)
155
    if @task
156
      wait_on_response(@task)
157
      @task = nil
158
    end
159

    
160
    tasks = @repo_resource.delete(id)
161
    wait_on_response(tasks)
162
  rescue
163
  end
164

    
165
  def rpm_ids
166
    @repo_extension.rpm_ids(RepositorySupport.repo_id)
167
  end
168
end