Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

510/remove json rest v2 #541

Merged
merged 23 commits into from
Apr 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5d07d1b
Fix(Gemfile): Remove jbuilder gem and associated files
chrisma Apr 3, 2019
f86ffc9
Fix(Requests controller): Remove extracted methods
chrisma Apr 3, 2019
f703813
Fix(Requests Controller): Remove JSON from 'reject' method
chrisma Apr 3, 2019
1d12014
Refacor(Requests Controller): 'destroy' method
chrisma Apr 3, 2019
ff5105d
Refactor(Requests Controller): 'create' method
chrisma Apr 3, 2019
0ee964d
Refactor(Requests Controller): introduce 'set_request_templates'
chrisma Apr 3, 2019
b2f8a0a
Refactor(Requests Controller): Remove 'split requests'
chrisma Apr 3, 2019
0581a76
Fix(Requests Form): Display base errors
chrisma Apr 3, 2019
92e05ec
Refactor(Requests Controller): Make 'notify users' private
chrisma Apr 3, 2019
aee6cb5
Refactor(Requests Controller): Remove 'authenticate_state_change'
chrisma Apr 3, 2019
e17a37c
Refactor(Requests Controller): Remove ref to 'authenticate_state_change'
chrisma Apr 3, 2019
ad3f222
Refactor(Requests Controller): Use 'set_request'
chrisma Apr 3, 2019
6ef9aa3
Refactor(Requests Controller): 'update' method
chrisma Apr 3, 2019
20dae88
Refactor(Requests Controller): 'index' db access
chrisma Apr 3, 2019
6716bd0
Refactor(Requests Controller): 'safe_create_vm_for'
chrisma Apr 3, 2019
24fc8a2
Refactor(Requests Controller): Remove 'notice_for'
chrisma Apr 3, 2019
3754542
Refactor(Requests Controller): Remove 'prepare_params'
chrisma Apr 3, 2019
a554364
Chore(Requests Controller): Whitespace
chrisma Apr 3, 2019
08be7ca
Merge branch 'dev' into 510/remove_json_rest
chrisma Apr 4, 2019
10aff38
Merge branch 'dev' into 510/remove_json_rest
chrisma Apr 5, 2019
872db76
Merge branch 'dev' into 510/remove_json_rest
bdaase Apr 12, 2019
9c0ee3b
Merge branch 'dev' into 510/remove_json_rest
chrisma Apr 25, 2019
1966d12
Fix(Request model): Use scopes for status
chrisma Apr 25, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ gem 'omniauth_openid_connect' # https://github.com/m0n9oose/omniauth_openid_conn
gem 'pundit' # https://github.com/varvet/pundit
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.1.0', require: false # https://github.com/Shopify/bootsnap
# Build JSON APIs with ease.
gem 'jbuilder', '~> 2.5' # https://github.com/rails/jbuilder
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use ActiveModel has_secure_password
Expand Down
5 changes: 0 additions & 5 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,6 @@ GEM
i18n (1.5.3)
concurrent-ruby (~> 1.0)
jaro_winkler (1.5.2)
jbuilder (2.8.0)
activesupport (>= 4.2.0)
multi_json (>= 1.2)
jquery-datatables (1.10.19.1)
jquery-rails (4.3.3)
rails-dom-testing (>= 1, < 3)
Expand Down Expand Up @@ -197,7 +194,6 @@ GEM
libv8 (>= 6.3)
minitest (5.11.3)
msgpack (1.2.6)
multi_json (1.13.1)
nenv (0.3.0)
net-ssh (5.1.0)
nio4r (2.3.1)
Expand Down Expand Up @@ -420,7 +416,6 @@ DEPENDENCIES
font-awesome-rails
git
guard
jbuilder (~> 2.5)
jquery-datatables
jquery-rails
listen (>= 3.0.5, < 3.2)
Expand Down
159 changes: 58 additions & 101 deletions app/controllers/requests_controller.rb
Original file line number Diff line number Diff line change
@@ -1,98 +1,83 @@
# frozen_string_literal: true

class RequestsController < ApplicationController
before_action :set_request, only: %i[show edit update push_to_git destroy request_state_change]
@@resource_name = Request.model_name.human.titlecase

before_action :set_request, only: %i[show edit update push_to_git destroy reject]
before_action :set_request_templates, only: %i[show new edit update create reject]
before_action :authenticate_employee
before_action :authenticate_state_change, only: %i[request_change_state]

# GET /requests
# GET /requests.json
def index
requests = current_user.admin? ? Request.all : Request.select { |r| r.user == current_user }
split_requests(requests)
if current_user.admin?
requests = Request.all
else
requests = Request.where(user: current_user)
end
@pending_requests = requests.pending
@resolved_requests = requests.resolved
end

# GET /requests/1
# GET /requests/1.json
def show
redirect_to edit_request_path(@request) if current_user.admin? && @request.pending?
@request_templates = RequestTemplate.all
end

# GET /requests/new
def new
@request = Request.new
@request_templates = RequestTemplate.all
end

# GET /requests/1/edit
def edit
redirect_to @request unless @request.pending?
@request_templates = RequestTemplate.all
end

def notify_users(title, message, link)
([@request.user] + @request.users + User.admin).uniq.each do |each|
each.notify(title, message, link)
end
end

# POST /requests
# POST /requests.json
def create
prepare_params

@request = Request.new(request_params.merge(user: current_user))
@request.assign_sudo_users(request_params[:sudo_user_ids])
respond_to do |format|
# check for validity first, before checking enough_resources?
# this is neccessary to ensure that the request contains all information needed for enough_resources?
if @request.valid? && enough_resources? && @request.save
successful_save(format)
else
unsuccessful_action(format, :new)
end
# check for validity first, before checking enough_resources?
# this is neccessary to ensure that the request contains all information needed for enough_resources?
if @request.valid? && enough_resources? && @request.save
notify_users('New VM request', @request.description_text, @request.description_url(host_url))
redirect_to requests_path, notice: t('flash.create.notice', resource: @@resource_name, model: @request.name)
else
render :new
end
end

# PATCH/PUT /requests/1
# PATCH/PUT /requests/1.json
def update
respond_to do |format|
prepare_params
@request.assign_sudo_users(request_params[:sudo_user_ids])
@request.accept!
if @request.update(request_params)
notify_request_update
safe_create_vm_for format, @request
else
unsuccessful_action format, :edit
end
@request.assign_sudo_users(request_params[:sudo_user_ids])
@request.accept!
if @request.update(request_params)
notify_request_update
safe_create_vm_for @request
else
render :edit
end
end

# PATCH /requests/reject/1
def reject
@request = Request.find params[:id]
respond_to do |format|
@request.reject!
if @request&.update(rejection_params)
notify_request_update
format.html { redirect_to requests_path, notice: "Request '#{@request.name}' rejected!" }
format.json { render status: :ok, action: :index }
else
unsuccessful_action format, :edit
end
@request.reject!
if @request.update(rejection_params)
notify_request_update
redirect_to requests_path, notice: "Request '#{@request.name}' rejected!"
else
render :edit
end
end

# DELETE /requests/1
# DELETE /requests/1.json
def destroy
@request.destroy
respond_to do |format|
format.html { redirect_to requests_url, notice: 'Request was successfully destroyed.' }
format.json { head :no_content }
if @request.destroy
notice = t('flash.destroy.notice', resource: @@resource_name, model: @request.name)
else
alert = t('flash.destroy.alert', resource: @@resource_name, model: @request.name)
end
redirect_to requests_url, notice: notice, alert: alert
end

# Creates puppet files for request and pushes the created files into a git repository
Expand All @@ -103,26 +88,15 @@ def push_to_git

private

def notice_for(vm, warning) # rubocop:disable Naming/UncommunicativeMethodParamName
if warning
{ alert: warning }
elsif vm
{ notice: 'VM was successfully created!' }
else
{ alert: 'VM could not be created due to an unkown error! Please create it manually in vSphere' }
end
end

def safe_create_vm_for(format, request)
def safe_create_vm_for(request)
vm, warning = request.create_vm
notices = notice_for vm, warning
if vm
format.html { redirect_to({ controller: :vms, action: 'edit_config', id: vm.name }, { method: :get }.merge(notices)) }
redirect_to edit_config_path(vm.name), notice: 'VM was successfully created!'
else
format.html { redirect_to requests_path, notices }
redirect_to requests_path, alert: "Error while creating VM! #{warning || 'Please create it manually in vSphere'}"
end
rescue RbVmomi::Fault => fault
format.html { redirect_to requests_path, alert: "VM could not be created, error: \"#{fault.message}\"" }
redirect_to requests_path, alert: "Error while creating VM! #{fault.message}"
end

def host_url
Expand All @@ -134,10 +108,14 @@ def set_request
@request = Request.find(params[:id])
end

def authenticate_state_change
@request = Request.find(params[:id])
authenticate_admin
redirect_to @request, alert: I18n.t('request.unauthorized_state_change') if @request.user == current_user && !current_user.admin?
def set_request_templates
@request_templates = RequestTemplate.all
end

def notify_users(title, message, link)
([@request.user] + @request.users + User.admin).uniq.each do |each|
each.notify(title, message, link)
end
end

def notify_request_update
Expand All @@ -158,33 +136,17 @@ def notify_request_update
end
end

def successful_save(format)
notify_users('New VM request', @request.description_text, @request.description_url(host_url))
format.html { redirect_to requests_path, notice: 'Request was successfully created.' }
format.json { render :show, status: :created, location: @request }
end

def unsuccessful_action(format, method)
@request_templates = RequestTemplate.all
format.html { render method }
format.json { render json: @request.errors, status: :unprocessable_entity }
end

# Storage and RAM are displayed in GB but internally stored in MB.
# sudo_user_ids always contain one empty element which must be removed
def prepare_params
request_parameters = params[:request]
return unless request_parameters

request_parameters[:sudo_user_ids] &&= request_parameters[:sudo_user_ids][1..-1]

# the user_ids must contain the ids of ALL users, sudo or not
request_parameters[:user_ids] ||= []
request_parameters[:user_ids] += request_parameters[:sudo_user_ids] if request_parameters[:sudo_user_ids]
end

# Never trust parameters from the scary internet, only allow the white list through.
# Modify parameters received from the request form
def request_params
if params[:request]
# sudo_user_ids always contain one empty element which must be removed
params[:request][:sudo_user_ids].reject!(&:blank?)
# the user_ids must contain the ids of ALL users, sudo or not
params[:request][:user_ids] ||= []
params[:request][:user_ids] += params[:request][:sudo_user_ids] if params[:request][:sudo_user_ids]
end

params.require(:request).permit(:name, :cpu_cores, :ram_gb, :storage_gb, :operating_system,
:port, :application_name, :description, :comment, :project_id, :port_forwarding,
:rejection_information, responsible_user_ids: [],
Expand All @@ -206,11 +168,6 @@ def puppet_name_script(request)

helper_method :puppet_name_script

def split_requests(requests)
@pending_requests = requests.select(&:pending?)
@resolved_requests = requests.reject(&:pending?)
end

def enough_resources?
hosts = VSphere::Host.all
if hosts.empty?
Expand Down
2 changes: 2 additions & 0 deletions app/models/request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ class Request < ApplicationRecord
MAX_NAME_LENGTH = 20

enum status: %i[pending accepted rejected]
scope :resolved, -> { where.not(status: :pending) }

validates :name,
length: { maximum: MAX_NAME_LENGTH, message: 'only allows a maximum of %{count} characters' },
format: { with: /\A[a-z0-9\-]+\z/, message: 'only allows lowercase letters, numbers and "-"' }
Expand Down
4 changes: 0 additions & 4 deletions app/views/app_settings/_app_setting.json.jbuilder

This file was deleted.

4 changes: 0 additions & 4 deletions app/views/operating_systems/_operating_system.json.jbuilder

This file was deleted.

3 changes: 0 additions & 3 deletions app/views/operating_systems/index.json.jbuilder

This file was deleted.

4 changes: 0 additions & 4 deletions app/views/request_templates/_request_template.json.jbuilder

This file was deleted.

3 changes: 0 additions & 3 deletions app/views/request_templates/index.json.jbuilder

This file was deleted.

3 changes: 0 additions & 3 deletions app/views/request_templates/show.json.jbuilder

This file was deleted.

2 changes: 2 additions & 0 deletions app/views/requests/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<%= bootstrap_form_with(model: request, local: true) do |form| %>
<%# https://github.com/bootstrap-ruby/bootstrap_form#alert-messages %>
<%= form.alert_message "Please fix the errors below.", error_summary: false %>
<%# Displays errors set in controllers on model.errors[:base] %>
<%= form.errors_on :base %>

<div class="container-fluid mt-4">
<div class="row border-bottom mb-4 pb-4">
Expand Down
4 changes: 0 additions & 4 deletions app/views/requests/_request.json.jbuilder

This file was deleted.

3 changes: 0 additions & 3 deletions app/views/requests/index.json.jbuilder

This file was deleted.

3 changes: 0 additions & 3 deletions app/views/requests/show.json.jbuilder

This file was deleted.

4 changes: 0 additions & 4 deletions app/views/servers/_server.json.jbuilder

This file was deleted.

3 changes: 0 additions & 3 deletions app/views/servers/index.json.jbuilder

This file was deleted.

3 changes: 0 additions & 3 deletions app/views/servers/show.json.jbuilder

This file was deleted.

2 changes: 1 addition & 1 deletion spec/end_to_end/end_to_end_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
select(@project.name, from: 'request_project_id')
fill_in('Description', with: 'test')
click_on 'Create Request'
expect(page).to have_text('Request was successfully created.')
expect(page).to have_css '.alert-success'
expect(page).to have_current_path('/vms/requests')
click_on @requestname
expect(page.body).to have_text('Request Information')
Expand Down