Skip to content
This repository has been archived by the owner on Oct 27, 2022. It is now read-only.

Propagate exceptions as higher as possible #83

Merged
merged 6 commits into from
Mar 10, 2021
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
56 changes: 18 additions & 38 deletions CodeReady Containers/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,14 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
// check if pull-secret-file is configured
// if yes call HadleStart("")
// otherwise invoke the pullSecretPicker view
let response = GetConfigFromDaemon(properties: ["pull-secret-file"])
var response: Dictionary<String, String>
do {
response = try GetConfigFromDaemon(properties: ["pull-secret-file"])
} catch let error {
showAlertFailedAndCheckLogs(message: "Failed to Check if Pull Secret is configured",
informativeMsg: "Ensure the CRC daemon is running, for more information please check the logs.\nError: \(error)")
return
}
if self.status == "Stopped" {
DispatchQueue.global(qos: .userInteractive).async {
HandleStart(pullSecretPath: "")
Expand Down Expand Up @@ -146,41 +153,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
NSApplication.shared.terminate(self)
}

func updateStatusMenuItem(status: String) {
if status == "Stopped" {
self.statusMenuItem.title = "Cluster is Stopped"
self.statusMenuItem.image = NSImage(named:NSImage.statusUnavailableName)
}
if status == "Running" {
self.statusMenuItem.title = "Cluster is Running"
self.statusMenuItem.image = NSImage(named:NSImage.statusAvailableName)
}
}

func showClusterStartingMessageOnStatusMenuItem() {
self.statusMenuItem.title = "Cluster is starting..."
self.statusMenuItem.image = nil
}

func showClusterStatusUnknownOnStatusMenuItem() {
self.statusMenuItem.title = "Status Unknown"
self.statusMenuItem.image = NSImage(named: NSImage.statusNoneName)
}
func updateMenuStates(state: MenuStates) {
self.startMenuItem.isEnabled = state.startMenuEnabled
self.stopMenuItem.isEnabled = state.stopMenuEnabled
self.deleteMenuItem.isEnabled = state.deleteMenuEnabled
self.webConsoleMenuItem.isEnabled = state.webconsoleMenuEnabled
self.ocLoginForDeveloper.isEnabled = state.ocLoginForDeveloperEnabled
self.ocLoginForKubeadmin.isEnabled = state.ocLoginForAdminEnabled
self.copyOcLoginCommand.isEnabled = state.copyOcLoginCommand
}

func initializeMenus(status: String) {
self.statusMenuItem.title = "Status Unknown"
self.statusMenuItem.image = NSImage(named:NSImage.statusNoneName)
updateStatusMenuItem(status: status)
self.statusMenuItem.title = status
if status == "Running" {
self.statusMenuItem.image = NSImage(named:NSImage.statusAvailableName)
self.startMenuItem.isEnabled = false
self.stopMenuItem.isEnabled = true
self.deleteMenuItem.isEnabled = true
Expand All @@ -190,6 +166,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
self.ocLoginForKubeadmin.isEnabled = true
self.statusItem.button?.appearsDisabled = false
} else if status == "Stopped" {
self.statusMenuItem.image = NSImage(named:NSImage.statusUnavailableName)
self.startMenuItem.isEnabled = true
self.stopMenuItem.isEnabled = false
self.deleteMenuItem.isEnabled = true
Expand All @@ -199,6 +176,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
self.ocLoginForKubeadmin.isEnabled = false
self.statusItem.button?.appearsDisabled = true
} else {
self.statusMenuItem.image = NSImage(named:NSImage.statusNoneName)
self.startMenuItem.isEnabled = true
self.stopMenuItem.isEnabled = false
self.deleteMenuItem.isEnabled = false
Expand All @@ -214,10 +192,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
}

@objc func refreshStatusAndMenu() {
let status = clusterStatus()
self.status = status
DispatchQueue.main.async {
self.initializeMenus(status: status)
DispatchQueue.global(qos: .background).async {
let status = clusterStatus()
self.status = status
DispatchQueue.main.async {
self.initializeMenus(status: status)
}
}
}
}
126 changes: 31 additions & 95 deletions CodeReady Containers/DaemonCommander/DaemonCommander.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,81 +10,45 @@ import Socket
import Foundation

class DaemonCommander {
var daemonSocket: Socket? = nil
var socketPath: String
static var bufferSize = 1024
let socketPath: String
static let bufferSize = 1024

init(sockPath: String) {
self.socketPath = sockPath
}

deinit {
self.daemonSocket?.close()
}
// connect sets up the socket and connects to the daemon sokcet
public func connectToDaemon() {
do {
// Create an Unix socket...
try self.daemonSocket = Socket.create(family: .unix, type: .stream, proto: .unix)
guard let socket = self.daemonSocket else {
print("Unable to unwrap socket...")
return
}
self.daemonSocket = socket
try socket.connect(to: self.socketPath)
} catch let error {
guard error is Socket.Error else {
print(error.localizedDescription)
return
}
}
}

public func sendCommand(command: Data) {
public func sendCommand(command: Data) throws -> Data {
do {
try self.daemonSocket?.write(from: command)
} catch let error {
guard error is Socket.Error else {
print(error.localizedDescription)
return
let daemonSocket = try Socket.create(family: .unix, type: .stream, proto: .unix)
defer {
daemonSocket.close()
}
}
}

public func readResponse() -> Data {
do {
try daemonSocket.connect(to: self.socketPath)
try daemonSocket.write(from: command)
var readData = Data(capacity: DaemonCommander.bufferSize)
let bytesRead = try self.daemonSocket?.read(into: &readData)
if bytesRead! > 1 {
let bytesRead = try daemonSocket.read(into: &readData)
if bytesRead > 1 {
return readData
}
throw DaemonError.badResponse
} catch let error {
guard error is Socket.Error else {
print(error.localizedDescription)
return "Failed".data(using: .utf8)!
throw DaemonError.io
}
throw error
}
return "Failed".data(using: .utf8)!
}
}

let userHomePath: URL = FileManager.default.homeDirectoryForCurrentUser
let socketPath: URL = userHomePath.appendingPathComponent(".crc").appendingPathComponent("crc.sock")

func SendCommandToDaemon(command: Request) -> Data? {
do {
let req = try JSONEncoder().encode(command)
print(String(data: req, encoding: .utf8)!)
let daemonConnection = DaemonCommander(sockPath: socketPath.path)
print(socketPath.path)
daemonConnection.connectToDaemon()
daemonConnection.sendCommand(command: req)
let reply = daemonConnection.readResponse()
return reply
} catch let error {
print(error.localizedDescription)
}
return "Failed".data(using: .utf8)
func SendCommandToDaemon(command: Request) throws -> Data {
let req = try JSONEncoder().encode(command)
print(String(data: req, encoding: .utf8)!)
let daemonConnection = DaemonCommander(sockPath: socketPath.path)
return try daemonConnection.sendCommand(command: req)
}

struct ConfigsetRequest: Encodable {
Expand All @@ -105,55 +69,27 @@ struct configunset: Encodable {
var properties: [String]
}

func SendCommandToDaemon(command: ConfigsetRequest) -> Data? {
do {
let req = try JSONEncoder().encode(command)
let res = sendToDaemonAndReadResponse(payload: req)
if res?.count ?? -1 > 0 {
return res
}
}
catch let jsonErr {
print(jsonErr)
}
return "Failed".data(using: .utf8)
func SendCommandToDaemon(command: ConfigsetRequest) throws -> Data {
let req = try JSONEncoder().encode(command)
return try sendToDaemonAndReadResponse(payload: req)
}

func SendCommandToDaemon(command: ConfigunsetRequest) -> Data? {
do {
let req = try JSONEncoder().encode(command)
let res = sendToDaemonAndReadResponse(payload: req)
if res?.count ?? -1 > 0 {
return res
}
}
catch let jsonErr {
print(jsonErr)
}
return "Failed".data(using: .utf8)
func SendCommandToDaemon(command: ConfigunsetRequest) throws -> Data {
let req = try JSONEncoder().encode(command)
return try sendToDaemonAndReadResponse(payload: req)
}

func SendCommandToDaemon(command: ConfigGetRequest) -> Data? {
do {
let req = try JSONEncoder().encode(command)
let daemonConnection = DaemonCommander(sockPath: socketPath.path)
daemonConnection.connectToDaemon()
daemonConnection.sendCommand(command: req)
return daemonConnection.readResponse()
} catch let error {
print(error.localizedDescription)
}
return "Failed".data(using: .utf8)
func SendCommandToDaemon(command: ConfigGetRequest) throws -> Data {
let req = try JSONEncoder().encode(command)
let daemonConnection = DaemonCommander(sockPath: socketPath.path)
return try daemonConnection.sendCommand(command: req)
}

func sendToDaemonAndReadResponse(payload: Data) -> Data? {
func sendToDaemonAndReadResponse(payload: Data) throws -> Data {
let daemonConnection = DaemonCommander(sockPath: socketPath.path)
print(socketPath.path)
daemonConnection.connectToDaemon()
daemonConnection.sendCommand(command: payload)
let reply = daemonConnection.readResponse()
let reply = try daemonConnection.sendCommand(command: payload)
if reply.count > 0 {
return reply
}
return "Failed".data(using: .utf8)
throw DaemonError.badResponse
}
Loading