Richiesta alla community: connettore per SQL Server

Ciao a tutti, in particolare @frossi e @pierluigi.dilorenzo , @ggadaleta sta sperimentando al comune di Aprilia e servirebbe un connettore per SQL Server. Credo che aggiungendo il driver JDBC al lavoro di @frossi https://github.com/redsoft7/io-sdk-java dovrebbe essere semplice (dovrebbe bastare modificare la configurazione per includere il driver jdbc). Il problema e’ quello di avere un SQL server per provare… Io non ce l’ho (non so un tubo di SQL SErver). Chi puo’ aiutarci?

SQL server intendi Microsoft ?

ciao, aggiungere il driver non è complicato.
Per i test automatici si può fare come ho fatto con mysql e oracle tramite un container docker con dei dati di test.
Si potrebbe usare un container di SQL Server per linux, le versioni Developer ed Express sono gratuite.
https://hub.docker.com/_/microsoft-mssql-server

Che versione di SQL Server usa il comune?
(io a lavoro posso fare dei test sul 2005,2008 e 2016)

suona male? :slight_smile: si…

Ho aggiunto la parte per SQL Server. I test vengono eseguiti leggendo da un SQL Server 2019 Express creato con l’immagine docker.

Ho solo un problema con il deploy su openwhisk, sembra che i driver jdbc di sql server creano dei problemi, se chiama l’azione mi da un errore.

Sto indagando.

Come cacio sui maccheroni. Per essere chiari ti spiego cosa sta succedendo: @ggadaleta sta cercando di fare una demo per la presentazione di IO-SDK e serve connettersi a SQL Server. Ti stiamo con gli occhi puntati e se serve aiuto te lo diamo, incarico @pierluigi.dilorenzo di provare anche lui.

Due cose: da docker a docker devi specificare l’IP INTERNO (localhost non funziona)

e potresti dover aumentare la memoria minima richista.

Ieri sera ho poi trovato il problema.
Il jar dei driver SQL Server è firmato, quindi l’uber-jar creato per l’azione openwhisk va in errore (java.lang.SecurityException: Invalid signature file digest for Manifest main attributes).

Devo modificare la build per creare l’azione come zip contenente i due jar separati: l’uber-jar del progetto ed il jar del driver.

Vedo se riesco in pausa pranzo, o al massimo sta sera.

1 Mi Piace

esiste il modulo python per collegarsi a SqlServer e lo volevo utilizzare con Graphql. A questo punto lo posso usare anche per un semplice importer python che fa la query su una tabella/view con i campi che ci servono.
Giovedi’ sono in comune e forse avro’ il server a disposizione per installare iosdk.

Nessun problema se tu usi il modulo Python, ma non vedo niente di male ad avere anche il connettore SQL Server.

Usi quello che ti fa più comodo. Se funziona basta fare wsk action update e hai anche quello, fornendo una query e i parametri estrai eventualmente i dati. Io comunque chiedo a Francesco di finirlo e a Pierluigi di provarlo.

Ok , solo un warning per @frossi: ho visto il codice java dell’importer sqlserver.
Premetto che non sono un programmatore java.
Alla fine la "return (messages), ritorna un ArrayList.
Quando ho sviluppato l’importer in python con graphql abbiamo speso un pomeriggio intero con Michele proprio sulla return finale. In python abbiamo dovuto aggiungere il seguente (altrimenti i messaggi non venivano considerati:
new_json_data = []

    for item in json_data['data']['messages']:
            new_json_data.append(item)

    return {"body": { "data": new_json_data} }

Siamo sicuri che quel “return(messages)” funziona
grazie
Ciao
G

Non mi sono mai capitati questi tipi di errore (di firma) e, forse, sparerò qualche fesseria. Io utilizzo praticamente solo driver per Microsoft SQL con tutti quei tool java per la gestione dei DB (tipo DBeaver) e funzionano, sino ad ora, con qualsiasi versione di DB Server Microsoft. Li utilizzo anche in produzione e, al momento, non mi hanno mai tradito. Uno è il net.sourceforge.jtds.jdbc.Driver e l’altro com.microsoft.sqlserver.jdbc.SQLServerDriver (non so in che versione ma, se funzionano con tutte le versioni di DB, non me preoccupo più di tanto).
Se posso essere di aiuto…avrei però bisogno di essere indirizzato…sappiate che tutto quanto state facendo per me è del tutto nuovo (provengo dalla programmazione con linguaggi basati esclusivamente su file di testo ed estensione *.C; *.PLI; ecc.).

Ho corretto l’errore e testato l’import.
Ora le azioni vengono create come zip contenente tutti i jar.
Mi manca da generare i pacchetti con le github actions, ci guardo stasera.

@ggadaleta se guardi la classe Main li converto l’ArrayList nel formato JSON corretto.

@andy.fiore uso questo driver com.microsoft.sqlserver.jdbc.SQLServerDriver. L’errore era dovuto al fatto che creavo un unico jar con dentro il contenuto di tutti i jar delle dipendenze(uber jar).

@msciab il connettore graphql di @ggadaleta forse è più personalizzabile perchè puoi indicare una query. Io avevo preso spunto dai conenttori php e python e quindi per ora leggo da una tabella/vista “messages” con dei campi definiti.

2 Mi Piace

Come diceva Francesco il problema è che il driver microsoft è firmato, quindi viene controllata l’integrità del jar, mentre lui ha costruito un uber-jar che contiene il codice del connettore e il codice del driver in un nuovo jar e quindi risulta alterato.

Come diceva appunto la soluzione è fare un jar dentro un jar, una roba che mi risulta si può fare con il Fat Jar

1 Mi Piace

Grazie a @frossi e @msciab per i chiarimenti. :slightly_smiling_face:

Grazie @frossi ,
direi che per la sperimentazione andiamo con l’importer java. Per il progetto a seguire vedremo di introdurre graphql se necessario. Dico se necessario perche’ la view/table dove prendere i messages e’ sempre la stessa. Magari messaggi provenienti da ambienti diversi del comune possono essere facilmente trattati con processi di ETL invece di specializzare l’importer per ogni ambiente.
Dove posso scaricare l’importer che hai testato ?
E’ questa la docker image che hai usato per MSSQL ? (mcr.microsoft.com/mssql/server)
Vi terro’ informati sugli sviluppi con il comune.
ciao
G

@ggadaleta ho terminato la generazione dell’importer.

Puoi scaricarlo da qui.

Per installarlo usa il seguente comando:
wsk action update iosdk/import io-sdk-java-2020.0929.2207-snapshot-sqlserver.zip --main Main --docker openwhisk/actionloop-java-v8:nightly

Per quanto rigurda l’immagine docker ho usato mcr.microsoft.com/mssql/server:2019-latest.
Qui volendo trovi l’immagine che uso per i test, puoi scaricare la cartella ed eseguirla con il comando:
docker-compose up
e fermarla con il comando
docker-compose down
(il file ‘init/setup.sql’ è lo script che inizializza il database, dove trovi anche lo script per la creazione della tabella)

Per qualsiasi problema scrivimi!

1 Mi Piace

Francesco,
ho installato l’importer e avviato il server mssql come da tuoi script.
Configurato IODSK come segue:


All’import risulta il seguente errore:

Ho provato ad accedere a mssql con Azure Data Studio e invece riesco ad accedere e a vedere i dati della tabella messages con la seguente configurazione:

Strano che non riesce a collegarsi in jdbc.

A disposizione se vogliamo avviare uno zoom cosi’ ti faccio vedere il tutto.

grazie
ciao
G

Ah ah! Me l’aspettavo!

Attenzione che da DENTRO docker (e una azione viene eseguita dentro docker) localhost non è accessibile, devi dare l’ip che ha il server, e lo trovi con docker inspect.

L’IOSDK fa un sacco di magheggi per assegnare IP e hosts correttamente…

ho effettuato un po’ di ricerche e sono arrivato a questo:

wsk activation list

Datetime Activation ID Kind Start Duration Status Entity
2020-10-05 19:00:00 3cef771539cf4158af771539cfe1589c blackbox warm 14.836s success guest/import:0.0.4
2020-10-05 19:00:00 2ed82560fe52468c982560fe52468c08 blackbox cold 135ms success guest/upload:0.0.1
2020-10-05 18:59:31 feb4670525d34250b4670525d35250a1 blackbox cold 692ms success guest/import:0.0.4
2020-10-05 18:41:15 57b93afcee5a4ce9b93afcee5a8ce9c4 blackbox warm 14.852s success guest/import:0.0.4
2020-10-05 18:41:15 1b89423e22624f6b89423e22623f6b4d blackbox cold 137ms success guest/upload:0.0.1
2020-10-05 18:40:38 b32de5498777426bade5498777326b5f blackbox cold 658ms success guest/import:0.0.4
2020-10-05 18:40:32 01ed4f9bed1c47bbad4f9bed1c87bbec blackbox cold 133ms success guest/import:0.0.1
2020-10-05 18:23:38 77ce67f50e484e778e67f50e48de77ff blackbox warm 14.535s success guest/import:0.0.4
2020-10-05 18:23:37 bd11c3db8b8747f391c3db8b8727f35c blackbox warm 4ms success guest/upload:0.0.1
2020-10-05 18:22:59 87f61e96028747b8b61e96028737b8b4 blackbox warm 9ms success guest/import:0.0.4
2020-10-05 18:22:55 e19b9da79c4e412c9b9da79c4eb12c19 blackbox cold 137ms success guest/import:0.0.1
2020-10-05 18:20:28 676ddbd6e13c48deaddbd6e13c18de13 blackbox cold 15.452s success guest/import:0.0.4
2020-10-05 18:20:13 c67009b7dc75404fb009b7dc75d04f7c blackbox cold 145ms success guest/upload:0.0.1
2020-10-05 16:28:52 7ccf25ca1c704d4a8f25ca1c70dd4af7 blackbox cold 289ms success guest/send:0.0.1
2020-10-05 16:28:28 53d81bdc9f4c4450981bdc9f4c44505d blackbox warm 39ms success guest/import:0.0.4
2020-10-05 16:28:25 60315e1037fe44fab15e1037fe24fa6a blackbox cold 446ms success guest/import:0.0.1
2020-10-05 16:27:06 97d7162186d5423197162186d512317d blackbox warm 18ms success guest/import:0.0.4
2020-10-05 16:27:05 d4deb5efa176483e9eb5efa176683e4f blackbox cold 977ms success guest/import:0.0.4
2020-10-05 16:23:46 a039674600984d5eb9674600987d5efb blackbox warm 0s developer error guest/send:0.0.1
2020-10-05 16:18:25 9f7ada13cb134907bada13cb1379073e blackbox cold 853ms success guest/import:0.0.2
2020-10-05 16:17:50 e2d017ca1e8c4d0d9017ca1e8c6d0d66 blackbox cold 222ms success guest/import:0.0.1
2020-10-05 16:13:58 f7667bb5a48e4829a67bb5a48e9829c7 nodejs:10 cold 302ms success guest/checkReady:0.0.1

andando a vedere i log della activation in errore risulta :

wsk activation logs a039674600984d5eb9674600987d5efb -d

[(*Client).LoadX509KeyPair]:210:[Wrn] The Cert file is not configured. Please configure the missing Cert file, if there is a security issue accessing the service.
[(*Client).LoadX509KeyPair]:219:[Wrn] The Key file is not configured. Please configure the missing Key file, if there is a security issue accessing the service.
[k.(*Client).addAuthHeader]:334:[Inf] Adding basic auth header; using authkey
[(*ActivationService).Logs]:239:[Inf] Sending HTTP request - URL 'http://localhost:3280/api/v1/namespaces//activations/a039674600984d5eb9674600987d5efb/logs’; req &http.Request{Method:“GET”, URL:(*url.URL)(0xc4202dd280), Proto:“HTTP/1.1”, ProtoMajor:1, ProtoMinor:1, Header:http.Header{“Authorization”:[]string{“Basic YjA4OTdkMDktNTY1Zi00NTQ3LTkwN2MtNjkxNThjZjM0MjNmOjhFSlpPNEczWU1nWW95VUVtV0loUVBIbnZuNmxncTZETTRCem45UFY2dEhoOEJhd3AyeDRuYUIyZE5YZmlVcHc=”}, “User-Agent”:[]string{“OpenWhisk-CLI/1.0 (2019-09-23T17:46:38.323+0000) darwin amd64”}}, Body:io.ReadCloser(nil), GetBody:(func() (io.ReadCloser, error))(nil), ContentLength:0, TransferEncoding:[]string(nil), Close:false, Host:“localhost:3280”, Form:url.Values(nil), PostForm:url.Values(nil), MultipartForm:(*multipart.Form)(nil), Trailer:http.Header(nil), RemoteAddr:"", RequestURI:"", TLS:(*tls.ConnectionState)(nil), Cancel:(<-chan struct {})(nil), Response:(*http.Response)(nil), ctx:context.Context(nil)}
REQUEST:
[GET] http://localhost:3280/api/v1/namespaces/
/activations/a039674600984d5eb9674600987d5efb/logs