Fabric: 'abort_on_prompts' menimpa warn_only = True

Dibuat pada 22 Okt 2012  ·  12Komentar  ·  Sumber: fabric/fabric

Mencoba menggunakan abort_on_prompts dan warn_only = True membuat abort_on_prompts menimpa warn_only dan fabric masih melontarkan SystemExit

In [6]: from fabric.api import sudo, execute, cd, env, run, local

In [7]: with settings(warn_only = True):
    result = local("ls -ltrh")
   ...:     
[localhost] local: ls -ltrh
total 188K
In [8]: with settings(warn_only = True):
    result = local("ls -ltrh /tmp/tartratrat")
   ...:     
[localhost] local: ls -ltrh /tmp/tartratrat
ls: cannot access /tmp/tartratrat: No such file or directory

Warning: local() encountered an error (return code 2) while executing 'ls -ltrh /tmp/tartratrat'


In [9]: env['abort_on_prompts'] = True

In [10]: with settings(warn_only = True):
    result = local("ls -ltrh /tmp/tartratrat")
   ....:     
[localhost] local: ls -ltrh /tmp/tartratrat
ls: cannot access /tmp/tartratrat: No such file or directory

Warning: local() encountered an error (return code 2) while executing 'ls -ltrh /tmp/tartratrat'


In [11]: with settings(warn_only = True):
    result = run("ls -ltrh /tmp/tartratrat")
   ....:     

Fatal error: Needed to prompt for the target host connection string, but abort-on-prompts was set to True

Aborting.
An exception has occurred, use %tb to see the full traceback.

SystemExit: 1
To exit: use 'exit', 'quit', or Ctrl-D.
Bug Core

Semua 12 komentar

(Protip, gunakan tautan "Github Flavored Markdown" di atas bidang teks, ini akan menunjukkan kepada Anda bagaimana memformat sesuatu dengan benar. Perbaiki deskripsi Anda untuk Anda :))

Saya berpendapat bahwa dalam banyak kasus ketika pengguna beralih abort_on_prompts , mereka _probably_ mengharapkan perilaku saat ini (batalkan) dan bukan peringatan-dan-lanjutkan. warn_only=True biasanya berlaku untuk apa yang harus dilakukan jika _program jarak jauh_ mengalami kegagalan, vs Fabric itu sendiri dibatalkan.

Namun saya mengakui bahwa situasi di mana keduanya Benar, tidak didefinisikan / didokumentasikan dengan baik. Selain itu, sebagian besar penggunaan lain dari abort() dalam basis kode telah diganti dengan panggilan ke error() yang menangani logika "batalkan jika warn_only=False ".

Saya akan menelepon sekarang bahwa konsistensi mengalahkan kemungkinan pengguna mencoba membatalkan sesuai permintaan dan digagalkan oleh warn_only=True tidak terduga, dan akan membuat perubahan yang Anda minta. Jika orang lain datang mengeluh, saya akan menempatkan Anda di depan;)

Jika direnungkan, saya benar-benar terkoyak dalam hal ini; Saya dapat melihat perubahan tersebut mengacaukan banyak hal bagi pengguna yang, seperti yang disebutkan, benar-benar ingin Fabric meledak pada permintaan yang tidak terduga. Kesalahan tersembunyi bisa sangat membuat frustasi untuk dilacak.

@pkittenis - situasi dunia nyata apa yang Anda hadapi di mana ini menjadi masalah bagi Anda? Apakah Anda dapat menggunakan try/except SystemExit untuk mengatasinya?

Jika Anda sulit diblokir oleh ini, yang mungkin lebih masuk akal adalah menambahkan beberapa opsi konfigurasi baru (dengan beberapa nama bodoh seperti warn_trumps_abort mungkin) sehingga orang-orang dalam kasus penggunaan Anda dapat mengontrol perilaku, tanpa menyebabkan perubahan yang tidak terduga untuk pengguna saat ini.

Masalahnya adalah bahwa perilaku abort_on_prompts menyebabkan fabric melempar SystemExit saat kembali ke No hosts found. Please specify (single) host string for connection: saat perintah mengalami kesalahan.

Saat menggunakan fabric sebagai API, itu IMO yang salah. Pengguna API telah menetapkan warn_only untuk menghindari SystemExit saat dieksekusi dan sebagai gantinya dapat menangani kode yang dikembalikan dalam kode. Itu keren.

Kemudian pengguna menetapkan abort_on_prompts dan alih-alih mendapatkan kode kesalahan untuk perintahnya ketika gagal, mereka mendapatkan SystemExit karena fallback ke enter a host dan penggunaan abort_on_prompts . Dapat menangani pengecualian, tentu saja, tetapi dalam hal ini Anda tidak dapat melihat kode kembali dari perintah yang gagal lagi.

Dapat mengatasi untuk saat ini dengan mengatur ulang abort_on_prompts kembali ke False tetapi itu perlu dilakukan pada setiap perintah yang mungkin gagal atau tidak,

Saya kira apa yang terbaik akan menjadi bendera untuk sepenuhnya menonaktifkan permintaan built in fabric yang dimaksudkan untuk digunakan pada baris perintah, khususnya No hosts found.. one, saat menggunakan fabric sebagai API. Kemudian abort_on_prompts tidak akan menyebabkan SystemExit karena tidak ada prompt yang menyebabkannya.

+1 - Saya sedang mengalami masalah ini sekarang. Kasus penggunaan konkret saya adalah bahwa saya menggunakan Fabric untuk melakukan pemeriksaan pada node cloud yang baru-baru ini disediakan dan mengonfirmasi apakah node tersebut memiliki akses SSH dengan kunci publik yang sesuai. Akibatnya, saya harus benar-benar _catch_ pengecualian abort_on_prompts. Untuk saat ini saya hanya akan menangkap SystemExit secara eksplisit, tetapi ini memang terasa sangat salah.

+1 - Saya juga ingin menangkap pengecualian abort_on_prompts.

: +1: Saya berada dalam situasi yang sama di mana saya tidak ingin SystemExit dibesarkan - pekerja seledri saya terbunuh.

Pada tahap ini saya merasa tingkat perubahan ini lebih cocok di versi 2.0 yang dirancang dengan kasus penggunaan API terlebih dahulu & kasus penggunaan CLI sebagai kasus penggunaan sekunder / pembungkus. Mengubah perilaku di 1.x akan terlalu mengejutkan / membingungkan / dapat menambah bug.

Memberi tag sebagai 2.x dan membiarkannya terbuka sehingga mudah-mudahan saya dapat mengunjungi kembali & memastikan saya mempertimbangkannya saat menulis bagian API tersebut.

+1 - ketika abort_on_prompts dan warn_only adalah _True_, warn_only harus menang.
Utas lain tentang masalah ini, oleh @reeesga : https://github.com/fabric/fabric/issues/521

+1

+1 - ketika abort_on_prompts dan warn_only adalah True, warn_only harus diutamakan. Pengaturan yang lebih baru untuk melakukan ini juga baik-baik saja

Ada pembaruan tentang ini?
Saya menangkap SystemExit tetapi itu hanya membuat keluaran saya jelek ...

Lihat sendiri:

webapps2adm001.qa.aws.company.com: Sambungan sebagai root SUKSES.
webapps2001.qa.aws.company.com: Sambungan sebagai root SUKSES.

Kesalahan fatal: Diperlukan untuk meminta kata sandi koneksi atau sudo (host: webapps3001.ia.aws.company.com), tetapi masukan akan menjadi ambigu dalam mode paralel

Membatalkan.
webapps3001.ia.aws.company.com: Koneksi sebagai root GAGAL. Keluar Sistem: 1
webapps3adm001.ia.aws.company.com: Sambungan sebagai root SUKSES.

Saya hanya ingin mempertahankan antrean setelah Aborting. Saya tidak ingin melihat pesan kesalahan.

Saya juga mengalami masalah ini dan ingin melihat perilaku saat ini berubah.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat