Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
66 changes: 53 additions & 13 deletions app/controllers/docker_manager/admin_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@ def repos
end

def progress
repo = DockerManager::GitRepo.find(params[:path])
repo = find_repos(params[:path], upgrading: true)
repo = find_repos(params[:path], all: true) if all_repos? && repo.blank?

raise Discourse::NotFound unless repo.present?

upgrader = Upgrader.new(current_user.id, repo, params[:version])
upgrader = Upgrader.new(current_user.id, repo, repo_version(repo))
render json: {
progress: {
logs: upgrader.find_logs,
Expand All @@ -61,35 +63,46 @@ def progress
end

def latest
repo = DockerManager::GitRepo.find(params[:path])
raise Discourse::NotFound unless repo.present?

repo.update_remote! if Rails.env == 'production'

render json: {
latest: {
proc = Proc.new do |repo|
repo.update_remote! if Rails.env == 'production'
{
path: repo.path,
version: repo.latest_origin_commit,
commits_behind: repo.commits_behind,
date: repo.latest_origin_commit_date
}
end

if all_repos?
return render json: {
repos: DockerManager::GitRepo.find_all.map(&proc)
}
end

repo = DockerManager::GitRepo.find(params[:path])
raise Discourse::NotFound unless repo.present?

render json: {
latest: proc.call(repo)
}
end

def upgrade
repo = DockerManager::GitRepo.find(params[:path])
repo = find_repos(params[:path])
raise Discourse::NotFound unless repo.present?

Thread.new do
upgrader = Upgrader.new(current_user.id, repo, params[:version])
upgrader = Upgrader.new(current_user.id, repo, repo_version(repo))
upgrader.upgrade
end
render plain: "OK"
end

def reset_upgrade
repo = DockerManager::GitRepo.find(params[:path])
repo = find_repos(params[:path], upgrading: true)
raise Discourse::NotFound unless repo.present?

upgrader = Upgrader.new(current_user.id, repo, params[:version])
upgrader = Upgrader.new(current_user.id, repo, repo_version(repo))
upgrader.reset!
render plain: "OK"
end
Expand All @@ -103,5 +116,32 @@ def ps
end
render plain: ps_output
end

private

def all_repos?
params[:path] == "all"
end

def find_repos(path, upgrading: false, all: false)
unless all_repos?
return DockerManager::GitRepo.find(path)
end

repos = DockerManager::GitRepo.find_all
return repos if all

repos.select do |repo|
(upgrading || !repo.upgrading?) && (repo.latest_local_commit != repo.latest_origin_commit)
end
end

def repo_version(repo)
return repo.is_a?(Array) ? concat_repos_versions(repo) : params[:version]
end

def concat_repos_versions(repos)
repos.map(&:latest_local_commit).join(", ")
end
end
end
2 changes: 1 addition & 1 deletion assets/docker-manager-app.css

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion assets/docker-manager-app.js

Large diffs are not rendered by default.

26 changes: 16 additions & 10 deletions lib/docker_manager/upgrader.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
class DockerManager::Upgrader

def initialize(user_id, repo, from_version)
def initialize(user_id, repos, from_version)
@user_id = user_id
@repo = repo
@repos = repos.is_a?(Array) ? repos : [repos]
@from_version = from_version
end

def reset!
@repo.stop_upgrading
@repos.each(&:stop_upgrading)
clear_logs
percent(0)
end
Expand Down Expand Up @@ -36,7 +36,9 @@ def try(times, cond)
end

def upgrade
return unless @repo.start_upgrading
@repos.each do |repo|
return unless repo.start_upgrading
end

percent(0)

Expand Down Expand Up @@ -101,8 +103,12 @@ def upgrade

# HEAD@{upstream} is just a fancy way how to say origin/master (in normal case)
# see http://stackoverflow.com/a/12699604/84283
run("cd #{@repo.path} && git fetch --tags && git reset --hard HEAD@{upstream}")
percent(20)

@repos.each_with_index do |repo, index|
run("cd #{repo.path} && git fetch --tags && git reset --hard HEAD@{upstream}")
percent(20 * (index + 1) / @repos.size)
end

run("bundle install --deployment --without test --without development")
percent(30)
run("bundle exec rake multisite:migrate")
Expand All @@ -128,7 +134,7 @@ def upgrade
STDERR.puts(ex.inspect)
raise
ensure
@repo.stop_upgrading
@repos.each(&:stop_upgrading)
end

def publish(type, value)
Expand Down Expand Up @@ -166,7 +172,7 @@ def run(cmd)
end

def logs_key
"logs:#{@repo.path}:#{@from_version}"
"logs:#{@repos.map(&:path).join(", ")}:#{@from_version}"
end

def clear_logs
Expand All @@ -178,7 +184,7 @@ def find_logs
end

def percent_key
"percent:#{@repo.path}:#{@from_version}"
"percent:#{@repos.map(&:path).join(", ")}:#{@from_version}"
end

def last_percentage
Expand All @@ -198,6 +204,6 @@ def log(message)
end

def log_version_upgrade
StaffActionLogger.new(User.find(@user_id)).log_custom('discourse_upgrade', from_version: @from_version, repository: @repo.path)
StaffActionLogger.new(User.find(@user_id)).log_custom('discourse_upgrade', from_version: @from_version, repository: @repos.map(&:path).join(", "))
end
end
2 changes: 1 addition & 1 deletion manager-client/app/components/repo-status.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export default Ember.Component.extend({
}.property('upgradingRepo', 'repo', 'managerRepo', 'managerRepo.upToDate'),

officialRepoImageSrc: function() {
if (!this.get('repo.official')) return;
if (!this.get('repo.official')) { return; }
return Discourse.getURL("/plugins/docker_manager/images/font-awesome-check-circle.png");
}.property('repo.official'),

Expand Down
16 changes: 15 additions & 1 deletion manager-client/app/controllers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,19 @@ import Ember from 'ember';

export default Ember.Controller.extend({
managerRepo: null,
upgrading: null
upgrading: null,

upgradeAllButtonDisabled: function () {
return !this.get("managerRepo.upToDate") || this.get("allUpToDate");
}.property("managerRepo.upToDate", "allUpToDate"),

allUpToDate: function() {
return this.get("model").every(repo => repo.get("upToDate"));
}.property("model.@each.upToDate"),

actions: {
upgradeAllButton() {
this.replaceRoute("upgrade", "all");
}
}
});
54 changes: 48 additions & 6 deletions manager-client/app/controllers/upgrade.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* global MessageBus, bootbox */
import Ember from 'ember';
import Repo from 'manager-client/models/repo';

export default Ember.Controller.extend({
output: null,
Expand All @@ -12,6 +13,34 @@ export default Ember.Controller.extend({
complete: Ember.computed.equal('status', 'complete'),
failed: Ember.computed.equal('status', 'failed'),

multiUpgrade: function() {
return this.get("model.length") !== 1;
}.property("model.length"),

title: function () {
return this.get("multiUpgrade") ? "All" : this.get("model")[0].get("name");
}.property("model.@each.name"),

isUpToDate: function () {
return this.get("model").every(repo => repo.get("upToDate"));
}.property("model.@each.upToDate"),

upgrading: function () {
return this.get("model").some(repo => repo.get("upgrading"));
}.property("model.@each.upgrading"),

repos() {
const model = this.get("model");
return this.get("isMultiple") ? model : [model];
},

updateAttribute(key, value, valueIsKey = false) {
this.get("model").forEach(repo => {
value = valueIsKey ? repo.get(value) : value;
repo.set(key, value);
});
},

messageReceived(msg) {
switch(msg.type) {
case "log":
Expand All @@ -24,23 +53,23 @@ export default Ember.Controller.extend({
this.set('status', msg.value);

if (msg.value === 'complete' || msg.value === 'failed') {
this.set('model.upgrading', false);
this.updateAttribute('upgrading', false);
}

if (msg.value === 'complete') {
this.set('model.version', this.get('model.latest.version'));
this.updateAttribute('version', "latest.version", true);
}
break;
}
},

upgradeButtonText: function() {
if (this.get('model.upgrading')) {
if (this.get("upgrading")) {
return "Upgrading...";
} else {
return "Start Upgrading";
}
}.property('model.upgrading'),
}.property("upgrading"),

startBus() {
const self = this;
Expand All @@ -60,7 +89,13 @@ export default Ember.Controller.extend({
actions: {
start() {
this.reset();
const repo = this.get('model');

if (this.get("multiUpgrade")) {
this.updateAttribute("upgrading", true);
return Repo.upgradeAll().finally(() => this.updateAttribute("upgrading", false));
}

const repo = this.get('model')[0];
if (repo.get('upgrading')) { return; }
repo.startUpgrade();
},
Expand All @@ -71,7 +106,14 @@ export default Ember.Controller.extend({
bootbox.confirm("WARNING: You should only reset upgrades that have failed and are not running.\n\n"+
"This will NOT cancel currently running builds and should only be used as a last resort.", function(result) {
if (result) {
const repo = self.get('model');
if (self.get("multiUpgrade")) {
return Repo.resetAll().finally(() => {
self.reset();
this.updateAttribute("upgrading", false);
});
}

const repo = self.get('model')[0];
repo.resetUpgrade().then(function() {
self.reset();
});
Expand Down
15 changes: 15 additions & 0 deletions manager-client/app/models/repo.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,21 @@ Repo.reopenClass({
});
},

upgradeAll() {
return request(Discourse.getURL("/admin/docker/upgrade"), { dataType: "text", type: "POST", data: { path: "all" } });
},

resetAll() {
return request(Discourse.getURL("/admin/docker/upgrade"), { dataType: "text", type: "DELETE", data: { path: "all" } });
},

findLatestAll() {
return request(Discourse.getURL("/admin/docker/latest"), { dataType: "text", type: "GET", data: { path: "all" } });
},

findAllProgress() {
return request(Discourse.getURL("/admin/docker/progress"), { dataType: "text", type: "GET", data: { path: "all" } });
},
});

export default Repo;
2 changes: 0 additions & 2 deletions manager-client/app/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ export default Ember.Route.extend({
},

setupController(controller, model) {
const self = this;

const applicationController = this.controllerFor('application');
controller.setProperties({ model, upgrading: null });

Expand Down
29 changes: 23 additions & 6 deletions manager-client/app/routes/upgrade.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,35 @@ import Ember from 'ember';
export default Ember.Route.extend({

model: function(params) {
if (params.id === "all") {
return Repo.findAll();
}
return Repo.find(params.id);
},

afterModel: function(model) {
var self = this;
return Repo.findUpgrading().then(function(u) {
if (Array.isArray(model)) {
return Repo.findLatestAll().then(response => {
JSON.parse(response).repos.forEach(_repo => {
const repo = model.find(repo => repo.get("path") === _repo.path);
if (!repo) { return; }
delete _repo.path;
repo.set("latest", Ember.Object.create(_repo));
});

return Repo.findAllProgress().then(progress => {
this.set("progress", JSON.parse(progress).progress);
});
});
}

return Repo.findUpgrading().then(u => {
if (u && u !== model) {
return Ember.RSVP.Promise.reject("wat");
}
return model.findLatest().then(function() {
return model.findProgress().then(function(progress) {
self.set("progress", progress);
return model.findLatest().then(() => {
return model.findProgress().then(progress => {
this.set("progress", progress);
});
});
});
Expand All @@ -25,7 +42,7 @@ export default Ember.Route.extend({
setupController: function(controller, model) {
controller.reset();
controller.setProperties({
model: model,
model: Array.isArray(model) ? model : [model],
output: this.get('progress.logs'),
percent: this.get('progress.percentage')
});
Expand Down
Loading